Как обработать сбой в процессе, запущенном через System.Diagnostics.Process? - PullRequest
14 голосов
/ 23 марта 2009

Я запускаю внешний процесс с System.Diagnostics.Process. Это часть пакетного задания, поэтому, если происходит сбой одного из процессов, я бы хотел обработать его, а остальные продолжить.

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

Согласно этому вопросу свойство Process.Responding доступно только для программ с пользовательским интерфейсом (запускаемый мной процесс является консольным приложением).

Я также рассмотрел различные события, которые предоставляет процесс, но ни одно из них не срабатывает при сбое.

Есть идеи?

Ответы [ 2 ]

25 голосов
/ 23 марта 2009

Попробуйте установить для реестра следующее значение реестра в значение DWORD 2:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2

Это повлияет на все процессы на машине.

Ссылка: Как избавиться от всплывающих сообщений системы и приложения

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

Если у вас нет источника, используйте функцию SetErrorMode в родительском элементе для подавления всплывающих окон. Режим ошибки наследуется подпроцессами. Вы должны установить для UseShellExecute значение false, чтобы это работало:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace SubProcessPopupError
{

    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int SetErrorMode(int wMode);

        static void Main(string[] args)
        {
            int oldMode = SetErrorMode(3);
            Process p;
            ProcessStartInfo ps = new ProcessStartInfo("crash.exe");
            ps.UseShellExecute = false;
            p = Process.Start(ps);
            SetErrorMode(oldMode);
            p.WaitForExit();
        }
    }
}

Если вы получаете диалоговое окно с надписью «Хотите отладку с использованием выбранного отладчика?», Вы можете отключить его, установив для этого параметра реестра значение 0.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0

Однако я не думаю, что это произойдет, если вы установили режим ошибки на 3, как описано выше.

0 голосов
/ 29 июля 2011

Другой вариант - запустить исполняемый файл под cdb , а затем найти слово «исключение», используя следующую командную строку:

cdb.exe -G -g -c "Q" <your executable>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...