Перехват необработанного исключения, вызванного неуправляемым подпроцессом

Используя объект C# System.Diagnostics.Process, я запускаю неуправляемый исполняемый файл, который позже запускает еще один неуправляемый исполняемый файл.

Второй exe вызывает необработанное исключение, которое я бы хотел, чтобы мое приложение игнорировало, но, похоже, не может.

Я использую оператор try/catch, когда запускаю первый процесс, но, похоже, он не перехватывает исключение, вызванное вторым процессом. Когда возникает исключение, оперативный отладчик уведомляет меня и останавливает мое приложение до тех пор, пока я вручную не нажму «да», я хочу отлаживать, или «нет». Затем мое приложение продолжается.

У JIT-отладчика нет исходного кода для 2ndprocess.exe, вызывающего исключение. Таким образом, это не говорит мне, что такое исключение. Мне все равно, что это за исключение, я просто хочу знать, как его поймать и проигнорировать, чтобы мое приложение не было остановлено им. К моменту возникновения исключения работа все равно выполняется.

Кто-нибудь может предложить некоторое понимание?


person Lonnie Best    schedule 27.01.2010    source источник
comment
Я обнаружил исключение в средстве просмотра «Управление компьютером»: необработанное исключение win32 произошло в 2ndProcess.exe [2656]. Отладка Just-In-Time этого исключения не удалась со следующей ошибкой: Ошибка удаленного вызова процедуры.   -  person Lonnie Best    schedule 28.01.2010
comment
У вас есть доступ к первому неуправляемому коду? Если это так, вам нужно перехватить ошибку, поскольку она запускает второй неуправляемый процесс.   -  person t0mm13b    schedule 28.01.2010


Ответы (2)


Вы должны правильно обрабатывать исключение во втором исполняемом файле. Ваша основная программа не поймает исключение, потому что она не генерирует его, а выполняет то, что есть.

Редактировать:

У вас есть доступ к источнику второго процесса (тот, который выдает исключение)? Ваше приложение никогда не должно просто падать. Если исключительный случай правильно обрабатывается во втором процессе, у вас не будет этой проблемы в основном приложении.

Редактировать2:

Поскольку у вас есть доступ к исходному коду (открытый исходный код), я рекомендую вам исправить ошибку. Это поможет вам двумя способами:

1) Ваша программа, наконец, заработает.
2) Вы можете сказать, что участвовали в проекте с открытым исходным кодом.

И, в качестве специального бонуса, вы можете помочь проекту, который вы часто используете. Выигрыш/выигрыш

person Robert Greiner    schedule 27.01.2010
comment
Мое приложение явно не запускает второй процесс. Первый процесс (который неуправляемый) запускает его. Итак, как я могу правильно обрабатывать 2-й процесс? - person Lonnie Best; 28.01.2010
comment
Если только 2ndprocess.exe не является внешним компонентом, над которым у них нет контроля... Мы уже видели это раньше. - person Byron Ross; 28.01.2010
comment
@Byron, это может быть так, если вы не можете это исправить, то, я думаю, лучше всего, чтобы основное приложение создало условия, необходимые для того, чтобы не получить это исключение, если это вообще возможно в этой ситуации. - person Robert Greiner; 28.01.2010
comment
@ Роберт, я даже не уверен, что мое приложение (как вы говорите) получает исключение. Потому что мое приложение не аварийно завершает работу, оно просто останавливается, пока я вручную не подтвержу да или нет в появившемся диалоговом окне JIT-отладчика. - person Lonnie Best; 28.01.2010
comment
Да, ваше приложение не перехватывает исключение, вот в чем проблема. Ваше второе приложение (выполняемое первым) выдает исключение в своем программном пространстве. Ваше основное приложение никогда не узнает о выброшенном исключении. - person Robert Greiner; 28.01.2010
comment
Да, он никогда не знает об этом, но он останавливает его. Видите ли, когда второй процесс дает сбой, мой первый процесс также дает сбой (который я могу поймать и обработать). Я предполагаю, что нет простого способа предотвратить эту остановку, потому что то, что останавливает мое приложение, находится за пределами способности моего приложения отслеживать и контролировать его. Я хотел бы, чтобы был какой-то способ заранее предупредить мое приложение, чтобы оно наблюдало за этим исключением, происходящим за пределами его естественной области, и отклоняло его программно. - person Lonnie Best; 28.01.2010
comment
Итак, я предполагаю, что у вас нет доступа к исходному коду для 2-го процесса? - person Robert Greiner; 28.01.2010
comment
см. правки, я рекомендую вам исправить код, который исправит ваше приложение и принесет вам известность. - person Robert Greiner; 28.01.2010

Поскольку вы используете process.start для фактического запуска приложения, приложение создает отдельный домен приложения. Я не верю, что захват исключения из этого приложения будет возможен, поскольку, скорее всего, из-за этого неудачного процесса появится диалоговое окно JIT.

Хотя это и не решение, вы можете остановить диалог, если это необходимо, но у этого есть свои проблемы.

person Mitchel Sellers    schedule 27.01.2010
comment
Вы предполагаете, что остановка диалогового окна также приведет к тому, что мое приложение не остановится в то время, когда диалоговое окно обычно появляется? - person Lonnie Best; 28.01.2010