Пользовательский обработчик исключений - PullRequest
1 голос
/ 21 марта 2012

Мне нужно написать собственный обработчик исключений ...

МОЕ приложение, вероятно, будет выдавать различные виды исключений, и я хотел бы, чтобы все они обрабатывались одним обработчиком (чтобы мне не нужно было использовать тысячи блоков try-catch).

Я пытался использовать обработчик UnDoledException для AppDomain, но, похоже, что при обнаружении исключения приложение неизбежно будет закрыто.

Итак, есть ли способ, которым я мог бы реализовать мою идею?

EDIT:

Спасибо за ваши быстрые ответы, но я бы хотел, чтобы вы лучше поняли мою ситуацию: у меня есть, например, класс, который выдает пользовательское исключение (обратимое). Теперь этот класс вызывается несколькими другими классами, поэтому мне нужно написать блок try-catch для каждого из них (или, по крайней мере, именно об этом ваши ответы заставляют меня задуматься) ..

Итак, приходит необходимость иметь обработчик, способный перехватить их всех ...

Ответы [ 5 ]

3 голосов
/ 21 марта 2012

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

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

Если вы пишете блоки try-catch, в которых catch не добавляет значения, не помогает восстановлению вашего кода, то вы не добавляете значение, перехватывая исключение!

1 голос
/ 21 марта 2012

Вы можете использовать обработчик UnhandledException для AppDomain, не закрывая приложение. Я делаю это тоже, чтобы регистрировать пропущенные исключения:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Program_UnhandledException);

И

private static void Program_UnhandledException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    //Handle the exception here...
}

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

Редактировать: я не знаю, работает ли он так же в консольных приложениях.

1 голос
/ 21 марта 2012

Вам не нужно «тысячи» блоков try / catch.

Поймите, что вы понимаете, только в тех местах, где вы можете принять решение.

Поймать исключение - очень большая часть вашей логики (в отличие от try / finally), и использование центрального обработчика 1 обычно не подходит.

Рассматривайте это как возможность изучить правильное использование исключений.

0 голосов
/ 21 марта 2012

Оберните ваш код в блок try и catch, который перехватывает исключение. Все исключения являются производными от исключения, поэтому каждое исключение, которое выбрасывается и не обрабатывается в другом месте, перехватывается здесь. Но помните, что если выдается исключение, вы имеете дело с возможным недопустимым состоянием вашего приложения. Вы не можете просто всегда продолжать после исключения. Другой, довольно прямой подход заключается в регистрации на Application.ThreadException (WinForms), но, опять же, вам не следует использовать это, если вы планируете продолжить работу приложения. Это для случаев, когда вы хотите отобразить сообщение, возможно, способ отправить отчет об ошибке, а затем закрыть приложение.

0 голосов
/ 21 марта 2012
try
{
    // Code that needs exception handling
}
catch (Exception ex)
{
    // Handle exception. You may use ex.GetType()
}

Если этого недостаточно, объясните, почему в вашем вопросе.

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