¿Cómo puedo saber cuándo .Net System.Diagnostics.Process se ejecutó correctamente o no?

StackOverflow https://stackoverflow.com/questions/155540

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un planificador u ordenaciones. Es básicamente una tabla con una lista de exes (como " C: \ a.exe ") y una aplicación de consola que examina los registros de la tabla cada minuto aproximadamente y ejecuta las tareas que aún no se han ejecutado.

Ejecuto las tareas como esta:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();

¿Cómo puedo saber si una tarea en particular falló? Por ejemplo, ¿qué pasa si a.exe lanza una excepción no controlada? Me gustaría que el código anterior supiera cuándo sucedió esto y actualizar la tabla de tareas con algo como " la tarea particular ha fallado " etc.

¿Cómo puedo hacer esto?

No estoy usando el Agente Sql o el Programador de Windows porque alguien más me dijo que no lo hiciera. Tiene más " experiencia " así que básicamente estoy siguiendo órdenes. Siéntete libre de sugerir alternativas.

¿Fue útil?

Solución

Puede obtener el Win32Exception para verificar si Process.Start () falló debido a que el archivo no existe o el acceso de ejecución se niega.

Pero no puede capturar las excepciones generadas por los procesos que crea utilizando esta clase. En primer lugar, es posible que la aplicación no esté escrita en .NET, por lo que es posible que no exista un concepto de excepción.

Lo que puede hacer es consultar el ExitCode de la aplicación o lea el StandardOutput y StandardError para verificar si hay mensajes de error se están publicando.

Otros consejos

Creo que estás buscando Process.ExitCode, asumiendo que el proceso devuelve uno. Puede que necesites usar WaitForExit () aunque. También hay un evento ErrorDataReceived que se activa cuando una aplicación envía a stderr.

Además de ExitCode, también puedes hacer algo como esto:

string output = p.StandardOutput.ReadToEnd();

Eso capturará todo lo que se habría escrito en una ventana de comandos. Luego, puede analizar esa cadena en busca de patrones conocidos para mostrar errores, dependiendo de la aplicación.

Para ampliar lo que dijo @jop. También deberá esperar a que se cierre el proceso. Así:

        p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

Los códigos que no son cero suelen ser errores. Algunos de los usos de aplicación negativos son errores y positivos como códigos de estado / advertencias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top