2013-11-21 2 views
1

У меня странный симптом в приложении, где try/catch внутри обработчика для UnhandledExceptions не работает: (это точка останова внутри catch не попадает даже если точка останова внутри try делает).try/catch не работает внутри обработчика UnhandledException

Очевидно, что поиск «исключение, необработанное внутри UnhandledException» работает не очень хорошо для меня.

Я пробовал сделать мини-доказательство концепции, и, к сожалению, это работает.

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

(Мы недавно изменили с XP на Windows7 и .Net 4.5 из 4.0 - я уверен, что ранее это сработало).

EDIT: Похоже, что это вызвано вызова вниз к (управляемом) C++ библиотеки, которая бросает System.AccessViolationException. Как ни странно, если я заменил вызов throw new AccessViolationException, он действительно сделает то, что я хочу ...

+0

Попробуйте отбросить исключения в одном 'AggregateException' и перебросить его - это обычная практика в .NET. –

+0

Я думаю, что мы не сможем обрабатывать исключение Unhandeled и должны окончательно выйти из приложения. – donstack

+0

Итак, вы выполняете какую-то работу внутри своего UnhandledException, которая в свою очередь бросает исключение, которое вы хотите поймать? – CathalMF

ответ

4

Вы написали: «Мы недавно изменили ... .Net 4.5 из 4.0 - Я почти уверен, что раньше это сработало». но следующий, кажется, стоит добавить, потому что уверен, что на самом деле означаетне уверен :-)

Я где-то читал, что AccessViolationException не может происходить в управляемом коде, но может быть в ловушке во время выполнения для неуправляемого кода. Может быть, библиотека C++ вызывает неуправляемый код?

В .NET 4+ процесс завершится после AccessViolationException. Ваш обработчик исключений будет проигнорирован. Это относится к группе исключений, которые считаются невосстановимыми: Corrupted State Exceptions. В .NET 4+ вам нужно будет настроить конфигурацию приложения, чтобы переопределить это поведение.

+1

Зеленая острая вещь твоя, сэр. Вы правы в обоих случаях: ['legacyCorruptedStateExceptionsPolicy'] (http://msdn.microsoft.com/en-us/library/dd638517%28v=vs.110%29.aspx) исправляет это и бросает AccessViolationException по-видимому, ничего подобного не делает. Большое спасибо. – Benjol

+0

@Benjol - отлично, спасибо за подтверждение. – groverboy

+0

Согласно [this] (http://antipatterns.blogspot.ch/2012/07/unhandled-exception-after-moving-to-net.html) другой альтернативой является добавление атрибута '[HandleProcessCorruptedStateExceptions]' в обработчике , – Benjol

1

Убедитесь, что вы пытаетесь поймать System.AccessViolationException и не иметь ошибки при доступе к среде.

Когда вы делаете throw new AccessViolationException, он выбрасывает System.AccAccessViolationException. Если библиотека, которую вы вызываете, является родной, она может вызывать внутреннюю ошибку нарушения доступа, но .NET catch блок обычно может захватывать только управляемые исключения.

+0

Хорошая идея, но не кажется, что в этом случае. – Benjol

Смежные вопросы