Как я могу узнать, когда.Net System.Diagnostics.Process успешно запущен или не работает?
Я пишу планировщик или сортирует. В основном это таблица со списком exes (например, "C:\a.exe") и консольное приложение, которое каждую минуту просматривает записи в таблице и запускает задачи, которые еще не выполнялись.
Я запускаю такие задачи:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();
Как я могу определить, что конкретная задача не удалась? Например, что если a.exe выдает необработанное исключение? Я хотел бы, чтобы приведенный выше код знал, когда это происходит, и обновил таблицу задач примерно так: "конкретная задача не выполнена" и т. Д.
Как я могу это сделать?
Я не использую Агент Sql или Планировщик Windows, потому что кто-то еще сказал мне не делать этого. У него больше "опыта", поэтому я в основном просто следую приказам. Не стесняйтесь предлагать альтернативы.
4 ответа
Вы можете перехватить Win32Exception, чтобы проверить, не удалось ли Process.Start() из-за того, что файл не существует или доступ к исполнению запрещен.
Но вы не можете отловить исключения, создаваемые процессами, которые вы создаете с помощью этого класса. Во-первых, приложение может быть написано не на.NET, поэтому концепция исключения может вообще отсутствовать.
Что вы можете сделать, это проверить ExitCode приложения или прочитать потоки StandardOutput и StandardError, чтобы проверить, публикуются ли сообщения об ошибках.
Я думаю, что вы ищете Process.ExitCode, предполагая, что процесс возвращает один. Возможно, вам придется использовать WaitForExit(), хотя. Существует также событие ErrorDataReceived, которое запускается, когда приложение отправляет в stderr.
В дополнение к ExitCode вы также можете сделать что-то вроде этого:
string output = p.StandardOutput.ReadToEnd();
Это будет захватывать все, что было бы записано в командном окне. Затем вы можете проанализировать эту строку на наличие известных шаблонов для отображения ошибок, в зависимости от приложения.
Подробнее о том, что сказал @jop. Вам также нужно будет дождаться закрытия процесса. Таким образом:
p.Start();
p.WaitForExit();
int returnCode = p.ExitCode;
Ненулевые коды обычно являются ошибками. Некоторые приложения используют отрицательные ошибки, а положительные - коды состояния / предупреждения.