поймать все исключения в приложении только с одной попытки - PullRequest
4 голосов
/ 16 июля 2010

Есть ли способ перехватить все исключения в приложении в Main () с помощью одного try-catch независимо от потоков и доменов приложения в приложении ??

Другими словами, я просто хочу использовать одинtry-catch для регистрации всех ошибок в моем приложении вместо использования нескольких перехватчиков в разных местах.

Буду признателен за любые идеи или фрагменты кода ...

Редактировать: я используюКонсольное приложение и служба Windows.

Ответы [ 3 ]

4 голосов
/ 16 июля 2010

Взгляните на http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx и http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx.

Я думаю, что это соответствует вашим потребностям

2 голосов
/ 16 июля 2010

Есть ли способ перехватить все исключения в приложении в Main () с помощью одного try-catch, независимо от потоков и доменов в приложении ??

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

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

1 голос
/ 16 июля 2010

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

Чего вы хотите добиться - сокращение кода?

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

[Yesterday...] The file format is invalid: InvalidFileFormatException. StackTrace: ...

Но что вы получаете от этой информации? Хорошо, я признаю, что если во всем приложении есть только один вызов, который может привести к созданию этого исключения, то все в порядке. Но что, если есть несколько вызовов одного и того же метода или если другие вызванные методы выдают одно и то же исключение?

Вы должны полагаться на подробное сообщение об Исключении, но, к сожалению, если речь идет об Исключениях, генерируемых Средой выполнения, вы не можете влиять на сообщения. Разве не было бы лучше иметь что-то вроде

string fileName = @"C:\Users\stackoverflow\Documents\file.frk";

try
{
  FreakingObject fo = freakingObjectConverter.ReadFromFile(fileName, FreakFormat.AutoDetect);
}
catch (InvalidFileFormatException iffe)
{
  MyLogger.LogError("File " + fileName + " had an invalid format:", iffe);
}

В примере вы по крайней мере получаете информацию о неверно отформатированном файле. Вы можете легко создавать более сложные примеры (HttpRequest и т. Д.), Где вы можете добавить очень полезную информацию в свой журнал, если только вы знали о контексте, в котором было создано исключение.

Небольшая подсказка при попытках улова вокруг Application.Run(...): имейте в виду, что всякий раз, когда вы достигаете блока catch, ваше приложение будет закрываться, если вы не возродите основную форму или не сделаете что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...