Поведение Catch Block при возникновении исключения - PullRequest
2 голосов
/ 19 марта 2012

Есть ли случай, когда блок catch пропускается при возникновении исключения скажем

try 
{
  some code
}
catch(Exception ex)
{
  some code
}

Я использую класс Exception, так как он перехватывает все исключения.

Ответы [ 6 ]

10 голосов
/ 19 марта 2012

У вас могут быть проблемы с StackOverflowException (см. Список исключений, которые НЕ МОГУТ быть перехвачены в .NET )

Существует другое семейство случаев, особенно когда выбрасывается вещь не было Exception, но это только в том случае, если у вас версия 1.1 или у вас не включена автоматическая упаковка исключений (она включена по умолчанию из 2.0) - это теоретически возможно для C ++бросить что-нибудь (не просто Exception), поэтому, если ваш "некоторый код" вызывает какой-то C ++, который выбрасывает, скажем, string, тогда в теории вы можетепропустите его.

На самом деле это редко (если вообще когда-либо) реальная проблема:

  • автоматическая упаковка по умолчанию включена
  • для большинства кодов C ++.NET бросает Exception (или подкласс) для хорошего поведения

В таких случаях catch { ... } будет работать, чтобы перехватить что-то, что было брошено, но не скажет вам что произошло.

2 голосов
/ 19 марта 2012

Как отметил Марк, есть несколько исключений, которые не могут быть перехвачены - например, StackOverflowException.

В .NET 4 существует концепция Исключения из-за поврежденного состояния для указания исключений, которые не доставляются в управляемый код, если код явно не проявил интерес к их обработке.Эти исключения (например, AccessVoilationException) указывают на серьезную программную ошибку и в целом не гарантируют согласованное состояние памяти / программы при возникновении.Смотрите эту прекрасную статью для получения дополнительной информации: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx

2 голосов
/ 19 марта 2012

Все исключения имеют Exception в качестве базового типа.Если код в блоке try вызывает исключение, это приведет к выполнению кода в блоке catch соответствующего типа.Если у вас также есть более конкретный блок catch, который совпадает, этот блок будет выполнен:

try
{
    throw new FileNotFoundException();
}
catch (FileNotFoundException)
{
    // this code will run
}
catch (Exception)
{
    // this won't (but will if a different exception is thrown)
}

Если код в блоке catch вызывает Exception, он покинет catch заблокируйте и найдите «родительский» catch блок, который соответствует.

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

1 голос
/ 19 марта 2012

Если есть исключение с CLR (например, переполнение стека) - оно не будет перехватывать это исключение.

Но за обычными исключениями вы все поймаете.

0 голосов
/ 19 марта 2012
try  
{   
    //some code 
} 
catch(System.DivideByZeroException dbz)
{
    //Divide by Zero exception catched
}
catch(Exception ex) 
{   
    //some code 
} 

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

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

0 голосов
/ 19 марта 2012

Не должно пропускать, так как все исключения получены из класса Exception.Был ли у вас случай, когда это случилось иначе?

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