Выбросить исключение в блоке 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? это плохой стиль кодирования? Должно ли это быть написано по-другому?
Ответы
Ответ 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 в качестве исключения. Это никогда не предназначалось как исключение для самостоятельного броска, поэтому вы, вероятно, не должны использовать его вообще.