4 votos

Obtener mensajes de un script python erróneo ejecutado en C# .NET con ArcObjects

Estoy tratando de implementar algún manejo de errores en mi código C# para mi aplicación .NET. Siento que me estoy perdiendo algo realmente obvio porque sé que tiene que haber una manera de hacer esto, pero simplemente no puedo averiguarlo. Tengo un script de python al que llamo usando gp.Execute() . Si hay un error en el script de python y no se completa, no puedo obtener el mensaje del mismo, porque cualquier llamada como gp.GetMessages() tiene que venir después del gp.Execute() para que nunca sea golpeado si el script encuentra un error y la ejecución se detiene en mi código C#. ¿Cómo obtienes los mensajes de error de tus scripts? También he intentado poner gp.GetMessages() en la sentencia catch pero el gp se considera fuera de alcance allí.

Mi código actual:

try {
     //stuff here

     //Run PopulatePatches script
     IGeoProcessor2 gp = new GeoProcessorClass();
     gp.AddToolbox(@"C:\Users\mxxx\Desktop\GIS_Testing\HbtatTesting\HabitatMon.tbx");
     IVariantArray parameters = new VarArrayClass();
     parameters.Add(shapefile);
     gp.Execute("PopulatePatches", parameters, null);
     gp.GetMessages(ref sev) //never hits this line if python script fails
}
catch {
     ViewBag.Message = "Failed!";
     return View();
}

Por último, me he deshecho del bloque try/catch y he intentado que el script se ejecute simplemente haciendo esto:

IGeoProcessorResult pResult = gp.Execute("PopulatePatches", parameters, null)
int severity = 2;
string messages = pResult.GetMessages(severity);

//I have also attempted the above line with just straight gp.GetMessages(severity) 
//because I think result objects are null if the tool doesn't execute properly

ViewBag.Message = messages;
return View();

Siempre se detendrá en la llamada de ejecución, lanzando el HResultado general E_FAIL COMException en .NET aunque sé que el error es un ZeroDivisionError en el script porque lo puse allí a propósito (el código se ejecuta perfectamente en python y en mi aplicación .NET si arreglo el error de división cero).

1 votos

Sólo una conjetura: podrías intentar mover el gp = new GeoProcessorclass() antes de try y luego llamar a gp.getMessages() dentro del catch bloque. (De hecho, lo único que quieres try es la llamada a Execute )

0 votos

@Berend Si pudiera votarte 100 millones de veces, lo haría. Llevo años intentando resolver esto y esa solución funciona perfectamente. No sé por qué no se me ocurrió simplemente mover gp en el ámbito local...

0 votos

Es bueno saberlo. Voy a copiar mi comentario en una respuesta.

6voto

Berend Puntos 587

Para obtener los mensajes en el catch la variable gp debe ser accesible fuera del bloque try .

También puede utilizar finally si quieres recibir los mensajes independientemente del éxito.

IGeoProcessor2 gp = new GeoProcessorClass();
gp.AddToolbox(@"C:\Users\mxxx\Desktop\GIS_Testing\HbtatTesting\HabitatMon.tbx");
IVariantArray parameters = new VarArrayClass();
parameters.Add(shapefile);

try 
{
     gp.Execute("PopulatePatches", parameters, null);
}
catch 
{
     ViewBag.Message = "Failed!";
}
finally
{
     var messages = gp.GetMessages(ref sev);
     // Do something useful with messages

     return View();
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X