Обработка исключений - это большое дело, и не так просто разработать хорошую стратегию для этого.
Прежде всего, некоторые общие правила:
- Исключения возникают при выполнениикод совершенно не способен продолжить работу, поэтому, возможно, он пытался обработать некоторые внутренние исключения, но в итоге потерпел неудачу.Подумайте о соединении TCP: если приходит поврежденный пакет, это исключение, но протокол TCP может справиться с этим.Если слишком много повреждено, генерируется исключение ввода-вывода или сокета
- Исключения не всегда могут быть обработаны .Почти во всех случаях, когда вы получаете исключение из нижележащих слоев, вы не можете выполнить корректирующий код.Если ваше приложение зависит от БД и находится в автономном режиме, при получении исключения об этом вы можете отобразить только сообщение об ошибке
- Исключения могут быть неожиданными и могут выявить недостатки проектирования или реализации.Например, недостатком реализации может быть ситуация, в которой у вас есть избыточная БД, но когда вы не можете подключиться к зеркалу, вы не пытаетесь со вторым
Для третьего пункта важно log исключений и периодически анализировать журналы, чтобы найти любую странную ситуацию.Итак, начнем с конкретного ответа.
Прежде всего
подумайте об «обработке» исключения.Когда вы пишете каждую отдельную строку кода, подумайте о возможных проблемах, которые могут помешать ее завершению, и подумайте о возможных корректирующих действиях .если таковые возможны.Сообщение об ошибке не является хорошим способом обработки, это новейшая стратегия.
Не начинайте писать try-catch (Exception), но предпочитайте конкретные исключения.Если вам нужно разобрать строки по числам и т. Д., Тогда ожидайте FormatException
, если вам нужно привести от Object
к вашему типу, ожидайте InvalidCastException
Когда вы пишете слои нижнего уровня
не стесняйтесь бросать исключения!Не делай так, как делают многие, т.е.return null
или используйте (как ANSI C) логическое возвращаемое значение и опорные параметры.Для этого есть исключения.Если вы можете обработать исключение (т. Е. Вы не нашли локальный файл, но знаете, что у вас есть удаленная резервная копия, поэтому обработайте FileNotFoundException
, вызвав удаленное зеркало, но если вы все еще не можете подключиться, то, в конечном счете, сбросьте), тогдасделать это и попытаться возобновить вычисления, но если вы не можете, то бросьте.И не забудьте выбросить внутреннее исключение, если оно есть, потому что это полезно для входа в верхний слой.
В принципе, вы все равно можете решить создать собственное исключение, даже если вы этого не сделаете.поймать любого!И это настоятельно рекомендуется, особенно когда параметры функции недопустимы!
Еще один хороший вариант - это войти в базовые слои.Вы действительно хотите регистрироваться независимо от того, что происходит исключение.
Когда вы регистрируете
, не забудьте придать сообщениям достаточную строгость.Если через код вы обнаружите, что ваша БД отключена, это не является неожиданным исключением.Тем не менее, регистрируйте его как ошибку, но не беспокойтесь об ошибках кода при изучении журналов.Вместо этого, если вы поймете исключение, которое ваш код не может распознать (NullReferenceException
- классический пример), тогда ведите журнал с наибольшей серьезностью, т.е.фатальный, чтобы дать ему максимальный приоритет!
Хорошая стратегия для ASP.NET
, безусловно, может основываться на методе Page.OnError
.Если у вас есть базовый класс страниц для всех страниц вашего сайта, вам определенно следует переопределить этот метод.В этом методе вы должны сначала log ваше исключение.
Вы также не должны злоупотреблять блоками try-catch (Exception), потому что если вы не поймаете исключение, вы можете 'Чтобы справиться с catch, вам придется обработать его с помощью OnError.
Когда вы запускаете такой метод, не думайте сразу о Server.RemoveError()
.Вы можете предпочесть статическую HTML-страницу для ошибки HTTP 500 (которая запускается, когда необработанное исключение переходит в среду выполнения ASP.NET), которая отображает сообщение вежливости пользователю.
Кратко
- Не стесняйтесь
throw
в нижележащих слоях, если происходит что-то странное
- Как сказано в вашем совете, не обрабатывайте исключения, которые вы не можете обработать (если вы поймали исключение, которое не можете обработать, сбросьте его)
- LOG !!!!!!!!!!!!!!!!!
- Не разглашайте подробности исключений конечным пользователям на общедоступном веб-сайте, никогда !! По умолчанию ASP.NET предотвращает это, но вы все равно можете использовать OnError для печати трассировки стека
- Используйте
OnError
или Application_Error
в качестве единой центральной точки для обработки всех непредвиденных исключений
- Периодически проверяйте журналы на наличие сообщений об ошибках / фатальных ошибках, чтобы найти проблемы с вашим кодом, а затем подумайте о том, чтобы поддерживать / отлаживать / исправлять его