Como posso saber quando .Net System.Diagnostics.Process executou com êxito ou não?
-
03-07-2019 - |
Pergunta
Eu estou escrevendo um programador ou tipos. É basicamente uma tabela com uma lista de exes (como "C: \ a.exe") e um aplicativo console que olha para os registros na tabela a cada minuto ou assim e executa as tarefas que não foram executados ainda
Eu corro as tarefas como esta:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();
Como posso saber se uma determinada tarefa falhou? Por exemplo o que se a.exe lança uma exceção não tratada? Eu gostaria que o código acima para saber quando isso acontece e atualizar a tabela de tarefas com algo como "a tarefa em particular falhou" etc.
Como posso fazer isso?
Eu não estou usando o Agente SQL ou do Windows Scheduler porque alguém me disse que não. Ele tem mais "experiência", então estou basicamente apenas seguindo ordens. Sinta-se livre para sugerir alternativas.
Solução
Você pode pegar o Win32Exception para verificar se Process.Start () falhou devido ao processo não existente ou executar o acesso é negado.
Mas você não pode capturar exceções lançadas pelos processos que você criar usando essa classe. Em primeiro lugar, o aplicativo não pode ser escrito em .NET portanto pode não ser um conceito de exceção em tudo.
O que você pode fazer é verificar no ExitCode do aplicativo ou leia a StandardOutput StandardError córregos para verificar se as mensagens de erro estão a ser publicados.
Outras dicas
Eu acho que você está procurando Process.ExitCode, assumindo o processo retorna um. Você pode precisar usar WaitForExit () embora. Há também um evento ErrorDataReceived que é acionado quando um aplicativo envia para stderr.
Além do ExitCode, você também pode fazer algo como isto:
string output = p.StandardOutput.ReadToEnd();
Essa captura de vontade tudo o que teria sido escrito para uma janela de comando. Em seguida, você pode analisar essa string em padrões conhecidos para a exibição de erros, dependendo do aplicativo.
Para expandir o que @jop disse. Você também terá que esperar para o processo de perto. Assim:
p.Start();
p.WaitForExit();
int returnCode = p.ExitCode;
Não-zero de códigos são normalmente erros. Alguns dos mais uso do aplicativo negativos são erros, e os positivos como os códigos de status / avisos.