Подтвердить что ты не робот

Выбросить исключение в блоке try

    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? это плохой стиль кодирования? Должно ли это быть написано по-другому?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Да, он будет ловить 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...
}

Ответ 3

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

Ответ 4

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