Сгенерировать исключение в блоке try - PullRequest
15 голосов
/ 20 июля 2010
    try { 
        if (isFileDownloaded)
            //do stuff
        else
            throw new CustomException()
   } 
   catch (Exception e)
   {
       // something went wrong save error to log
   }
   finally
   {
       //release resources
   }

Мой вопрос: будет ли catch ловить ApplicationException, брошенный в блок try? это в плохом стиле кодирования? Должно ли оно быть написано по-другому?

Ответы [ 4 ]

23 голосов
/ 20 июля 2010

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

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

Использование catch более полезно, IMO, для отлова исключений, вызванных методами.в вашем try блоке.Это было бы более полезно, например, если ваш раздел // do stuff вызвал метод, вызвавший исключение.

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

7 голосов
/ 20 июля 2010

Да, он будет ловить ApplicationException, поскольку происходит от Exception.

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

try{
    if (isFileDownloaded)
       //do stuff
    else
       throw new ApplicationException();
}
catch(ApplicationException ae)
{
   // log it application exception here...
}

catch(Exception ex)
{
   // log all other exceptions here...
}
finally
{
   // release resources...
}
1 голос
/ 20 июля 2010

Кроме того, FYI, ApplicationException устарело с .NET 2.0 как исключение для получения. Он никогда не задумывался как исключение, чтобы бросать сам по себе, поэтому вам, вероятно, вообще не следует его использовать.

1 голос
/ 20 июля 2010

Да, выгода поймает ваше ApplicationException, и да, это плохой стиль кодирования.Как хорошее общее правило, вылавливайте только определенные исключения и те, с которыми вы собираетесь что-то делать, например исправление состояния приложения.

...