2016-08-24 2 views
-1

Я пытаюсь использовать наилучшие методы обработки исключений, и я немного потерялся.Лучшее время, чтобы поймать ошибку C#

Например, если у меня есть 4 метода (один вызов другого, который вызывает другой). Для каждого метода может быть выбрано настраиваемое исключение того же типа.

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

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

Method1() 
{ 
    Method2(); 
} 

Method2() 
{ 
    Method3(); 
} 

Method3() 
{ 
    Method4(); 
} 

Method4() 
{ 
    //Some code that could throw a customException 
} 
+11

Исключения не должны быть «пойманы как можно скорее», исключения *** должны быть пойманы, когда их можно обработать соответствующим образом *** –

+4

Я хотел бы знать, где пришел принцип «как можно скорее» из. – itsme86

+0

Я читал, что в Интернете –

ответ

6

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

Написание надежного программного обеспечения сложно.

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

Это плохой принцип. Что делает возможность это связано с этим? Принцип, который вы должны написать только возможно код не помогает. Что делает раз об этом? Это тавтология, что правильное место для обработки исключения - , где исключение можно корректно обрабатывать; ни скорее и не позже чем это.

Где можно исключить правильное обращение? Это полностью зависит от (1) исключения и (2) того, как вы собираетесь его обрабатывать. Это звучит как очень бесполезный совет, но ваш вопрос невероятно расплывчато! Оставим исключения из него и рассмотрим только вычисления. Где находится Лучшее место для расчета? Лучше ли делать вычисления раньше или позже? Как вы могли бы ответить на этот вопрос для всех возможных вычислений?

Я просто хочу избежать того же типа ошибок во всех моих методах, чтобы я мог просто уловить мой большой метод?

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

  • Обработчики не должны зависеть от состояния, известного только вызываемым лицам, но не вызывающим.
  • Обработчики должны делать одно и то же в каждом вызове.
  • Вызов не должен вызываться нигде, кроме вызывающего.

В этой ситуации вы находитесь? Затем можно переместить обработчик в вызывающий объект без изменения семантики и тем самым уменьшить дублированный код.

Я хочу, чтобы закрыть мое приложение, поэтому зарегистрировать ошибку и закрыть мое приложение

Затем положить обработчик как можно ближе к Main, насколько это возможно.

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

Отметьте, что если ваше приложение отключается анонимно, как это , у вас нет гарантии, что ваша система регистрации не является тем, что взорвало, и вы можете снова взорвать его. Быть осторожен!

+0

Упомянутая «Я выгружаю приложение, потому что я получил событие необработанного исключения» должен быть [ AppDomain.UnhandledException Event] (https://msdn.microsoft.com/en-us/library/1ea9wwze (v = vs.110) .aspx), если я правильно понимаю. –

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