Como posso saber quando .Net System.Diagnostics.Process executou com êxito ou não?

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

  •  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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top