2012-03-21 2 views
1

Я в нуждаясь в написать обработчик исключений ...пользовательского обработчика исключений

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

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

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

EDIT:

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

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

+0

Какое приложение вы пишете? WinForms? Командная строка? –

+0

Да, я забыл написать эту деталь: я пишу консольное приложение;) – user1264377

+1

Re Редактировать: Как ваш код продолжить после ошибки? И: классы не звонят и не бросают. Способы делают. –

ответ

-1
try 
{ 
    // Code that needs exception handling 
} 
catch (Exception ex) 
{ 
    // Handle exception. You may use ex.GetType() 
} 

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

1

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

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

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

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

3

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

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

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

0

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

1

Вы можете использовать обработчик 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... 
} 

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

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

+0

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

Смежные вопросы