Как я могу использовать информацию об исключениях, которые метод вызывает в .NET в моем коде? - PullRequest
0 голосов
/ 23 марта 2010

Для многих методов в .NET исключения, которые они могут потенциально генерировать, могут быть целыми 7-8 (один или два метода в XmlDocument, я думаю, что Load () - один, может выдать столько исключений).

Означает ли это, что мне нужно написать 8 блоков catch, чтобы перехватить все эти исключения (рекомендуется перехватывать исключение с помощью конкретного блока исключений, а не просто общего блока catch типа Exception).

Как мне использовать эту информацию?

Спасибо

Ответы [ 3 ]

3 голосов
/ 23 марта 2010

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

try
{
    // some code
}
catch (SomeSpecificExceptionThanYouCanHandle ex)
{
    // This is an exception I can do something about
    // so I'll do something intelligent
}
catch (Exception ex)
{
    Logger.Error("Exception in SomeMethod: " + ex.Message);
    throw;
}

Итак, если вы вызываете метод, который может вызвать один из 8 различных типов исключений, добавьте блоки перехвата для этихчто вы можете справиться, и оставьте остальных для звонящего.Если вы пишете библиотеку классов (и, возможно, в противном случае), не забудьте документировать, какие исключения может выдавать ваш метод.

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

0 голосов
/ 23 марта 2010

Да, лучшая практика - иметь много уловов, а не использовать общее исключение, такие инструменты, как fxcop, подтвердят это при анализе вашего кода. На практике я видел в основном 2-3 улова.

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

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

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

Внутри улова вы обычно пишете либо в файл журнала, либо в журнал событий системы. Вы бы написали что-то вроде

string message = "Ошибка при получении продукта из базы данных. Система сообщает: ex.Message"

или

string message = "Ошибка при получении продукта из базы данных"

if (ex.Number == 20) { message = message + "Вероятно, это означает, что не удалось установить соединение с базой данных" }

message = message + ". Система сообщает: ex.Message"

0 голосов
/ 23 марта 2010

Ловля исключений просто является одним из способов управления потоком вашей программы. Вы правы, утверждая, что в целом перехват определенных исключений лучше, чем перехват более общих типов исключений (вплоть до Exception), но это не означает, что имеет смысл перехватывать все исключения. Определенные исключения не должны быть пойманы в ловушку вообще; в такой ситуации у вас должна быть система сообщений об ошибках, которая информирует вас о таком действительно исключительном поведении.

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

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