обработка исключений в .net - PullRequest
1 голос
/ 28 октября 2011

Я задал несколько вопросов здесь и прочитал несколько статей, посвященных обработке исключений, но не думаю, что я действительно понимаю, когда вы должны, а когда вы не должны обрабатывать исключение.Из статей, которые я прочитал, говорится: «Обрабатывать только те исключения, которые вы можете восстановить». Что это означает?Если я не могу справиться с исключением, что мне делать?Позвольте ему распространяться обратно вверх по стеку?Если я не справлюсь с этим, как я могу войти в систему и представить удобное сообщение об ошибке.Что большинство людей делают в веб-приложениях и веб-службах?

В качестве примера говорят, что у меня есть слой данных более низкого уровня, который извлекает данные из sql

try{
  //do something with db
}catch(SqlException ex){
 //what should i do here
 //should i call code again to retry getting data from db
}catch(Exception ex){
 //should i even catch exception of type exception
}

Как обрабатывать исключения в более низкихярусы?Должен ли я просто позволить исключению всплыть?Если это так, то если я хочу поймать исключение типа sqlexception, тогда мне нужна ссылка на библиотеку, частью которой является sqlexception, но, конечно, мне не нужно ссылаться на эту библиотеку в слое, который не имеет ничего общего с доступом к данным.

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

Некоторые простые основные правила:

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

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

  • Если вам нужно, чтобы человек предпринял корректирующие действия (вы почти всегда это делаете), убедитесь, что у него достаточно информации для устранения проблемы. Пусть исключения всплывают до уровня пользовательского интерфейса. Избегайте интерпретации исключений (например, «Не удалось обновить базу данных»), отображайте точное сообщение об исключении и трассировку стека.

  • Реализуйте обработчик для AppDomain.CurrentDomain.UnhandledException и зарегистрируйте или отобразите значение e.ExceptionObject. Помогает диагностировать необработанные исключения. И помогает вам не ставить улов везде.

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

1 голос
/ 28 октября 2011

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

Из статей, которые я прочитал, говорится, что «обрабатывать только те исключения, которые вы можете восстановить из» Чтозначит ли это

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

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

Если я не могу обработать исключение, что мне делать,Позвольте ему распространяться обратно в стек?

Да.

Если я не обращаюсь с этим, как я могу войти в систему и представить удобное сообщение об ошибке.Что большинство людей делают в веб-приложениях и веб-службах?

Веб-сервер регистрирует исключение.Если вы хотите представить удобное для пользователя сообщение об ошибке в веб-приложении, вы можете перехватить / записать в журнал на самом высоком уровне стека и перенаправить на ваше сообщение об ошибке.Опять же, я бы попытался не перехватывать System.Exception - вместо этого составьте список исключений, которые выдает ваше приложение, и поймайте только эти типы, прежде чем представлять сообщение, предназначенное для каждого типа.По мере роста списка типов исключений либо предотвращайте каждый новый тип исключения, изменяя код, либо добавляйте новый улов для этого типа исключения.

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

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

Как мне обрабатывать исключения на более низких уровнях.Должен ли я просто позволить исключению всплыть на ярусы.

Да.

1 голос
/ 28 октября 2011

Хорошо, это будет слишком кратко, так как здесь еще рано утром, но я боролся с этим же вопросом, поэтому вот что я понимаю:

"обрабатывать только те исключения, которые вымогу восстановиться после "

. Насколько я понимаю, вы получаете исключение для уровня кода, где вы можете что-то с этим сделать.В случае вашего низкоуровневого кода вы бы позволили исключению всплыть обратно в слой, где вы могли бы изменить свой «процесс» для обработки исключения и, возможно, повторить процесс.(Обычно я записываю ошибку прямо там, где она появляется.)

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