Некоторые исключения не могут быть перехвачены и отличаются от версии .NET к версии .NET. И некоторые исключения могут быть перехвачены и зарегистрированы, но не могут быть восстановлены из (исключения памяти). Однако их можно отладить (они называются исключения первого шанса , первый шанс всегда для отладчика, второй шанс для кода, благодаря JeroenH за указание это из) Вот пост в CodeProject, который объясняет этот принцип .
Что вы должны сделать, это выбрать некоторые возможные исключения в Visual Studio, которые, как вы подозреваете, могут возникнуть, и подключить отладчик к работающему экземпляру.
Наличие у вас неуправляемых ресурсов (последовательный порт) означает, что вы можете иметь неуправляемые утечки (не правильно использующие IDisposable
+ using
) и неуправляемые исключения. Эти исключения могут быть перехвачены только с пустым catch
(т.е. без указания четного Exception
, который является , а не родителем неуправляемых исключений) в блоке try / catch.
PS: некоторое неопределенное поведение может возникнуть, когда исключения вызываются в блоках finally или в финализаторах / деструкторах. Кроме того, немногие исключения распространяются через границы потоков и завершают все потоки.
Редактировать
Чтобы прояснить ситуацию, есть несколько исключений, которые CLR (и его спецификация) определяют как неуловимые. По сути, это все исключения, которые пересекают границы потоков. Эти асинхронные исключения, возникающие в пределах блокировки, приводят к повреждению состояния. Самыми известными являются OutOfMemoryException
, ThreadAbortException
и StackOverflowException
. Когда OutOfMemoryException
или StackOverflowException
происходит в синхронном коде, маловероятно, что вы можете исправить состояние, и CLR прекратит работу вашего приложения.
Кроме того, есть ExecutionEngineException
и BadImageFormatException
, которые не должны встречаться в проверяемом коде и не должны быть перехвачены. Исключения, такие как TypeLoadException
и MissingMemberException
, иногда могут быть перехвачены, а иногда нет (если отсутствует связанная сборка, их будет трудно перехватить, и не следует, но если вы используете отражение, вы должны перехватить это).
Вкратце: исключения должны быть перехвачены в потоке, в котором они происходят. Вы не сможете перехватывать исключения, если они возникают в другом потоке, потому что они не распространяются (за исключением ThreadAbortException
). Ваше приложение остается в живых после исключения (по крайней мере, вы думаете), поэтому логично предположить, что исключение не происходит в потоке, в котором вы пытаетесь его перехватить. Используя окно «Отладка> Исключения», вы можете выбрать любое исключение и разбить его на код при возникновении.
Примечание об исключении
Добавлена заметка об управляемых и неуправляемых исключениях. Вы не можете перехватить неуправляемое исключение, используя catch (Exception e)
, потому что неуправляемое исключение не наследуется от Exception
. Вместо этого используйте пустой улов, который перехватит любое неуправляемое исключение для вас. Оберните это вокруг методов вашего приложения и точки входа потока, и вы сможете перехватить большинство перехватываемых исключений.