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 detry
y luego llamar agp.getMessages()
dentro delcatch
bloque. (De hecho, lo único que quierestry
es la llamada aExecute
)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.