Как я могу сказать , когда .Сетевая система.Диагностика.Процесс прошел успешно или с ошибкой?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пишу планировщик или сортировку.По сути, это таблица со списком бывших пользователей (например, "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 Agent или планировщик Windows, потому что кто-то другой сказал мне не делать этого.У него больше "опыта", так что я, по сути, просто выполняю приказы.Не стесняйтесь предлагать альтернативные варианты.

Это было полезно?

Решение

Вы можете поймать Исключение Win32Exception чтобы проверить, есть ли Процесс.Запустите () сбой произошел из-за того, что файл не существует или доступ к исполнению запрещен.

Но вы не можете перехватывать исключения, генерируемые процессами, которые вы создаете с помощью этого класса.Во-первых, приложение может быть написано не на .NET, поэтому концепции исключения может вообще не существовать.

Что вы можете сделать, так это проверить Код выхода из приложения или прочтите Стандартный вывод и Стандартный сбой транслирует, чтобы проверить, публикуются ли сообщения об ошибках.

Другие советы

Я думаю, вы ищете Процесс.ExitCode, предполагая, что процесс возвращает единицу.Однако, возможно, вам придется использовать WaitForExit().Существует также событие ErrorDataReceived, которое запускается, когда приложение отправляет в stderr.

В дополнение к ExitCode, вы также можете сделать что-то вроде этого:

string output = p.StandardOutput.ReadToEnd();

Это позволит зафиксировать все, что было бы записано в командное окно.Затем вы можете проанализировать эту строку на наличие известных шаблонов отображения ошибок, в зависимости от приложения.

Подробнее о том, что сказал @jop.Вам также нужно будет дождаться завершения процесса.Таким образом:

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

Ненулевые коды, как правило, являются ошибками.Некоторые приложения используют отрицательные значения в качестве ошибок, а положительные - в качестве кодов состояния / предупреждений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top