2015-02-16 4 views
2

Мы используем MEF в нашем приложении WPF (MVVM) для встраивания внешних редакторов. В какой-то момент нашего основного представления есть элемент содержимого, в который будет помещен редактор.Поймать необработанные исключения из редактора

Теперь мы хотели бы поймать любое необработанное исключение из этого редактора, а затем перезагрузить редактор. Единственное, что я нашел, это использовать DispatcherUnhandledException из класса Application. Оттуда я должен был каким-то образом добраться до главного редактора представлений и сказать ему перезагрузить разбитый редактор.

Мне было интересно, есть ли «нижняя» точка уровня, где я мог бы поймать исключение? Кто-нибудь имеет некоторый опыт работы с ним и может помочь ему здесь?

Благодаря

+0

Как насчет добавления блока 'try/catch' вокруг кода, запускающего редактор? – Sheridan

+0

Редактор не запускается, он встроен в контейнер xaml через IOC. Таким образом, в основном это просто еще один элемент управления в нашем главном окне, и я не знаю, как бы потом это сделать в блок try/catch. – derape

+0

Вы также можете использовать событие ['AppDomain.UnhandledException'] (https://msdn.microsoft. com/en-us/library/system.appdomain.unhandledexception (v = vs.110) .aspx), чтобы поймать необработанное 'Exception', хотя это происходит просто * до того, как приложение закрывается *, поэтому я не думаю, что это событие - любое использование для вас. – Sheridan

ответ

0

Так что мой ответ был бы: ты лучше не, если вы даже могли. Когда вы получаете необработанное исключение, ваше приложение больше не находится в стабильном состоянии. Куда бы вы хотели вернуться? Что делать, если ваш внешний редактор выдает исключение из строя (например, исключение Win32 SEH), например AccessViolationException или OutOfMemoryException? В этом случае ваше приложение может находиться в неопределенном состоянии, поэтому дальнейшее выполнение может привести к потере и/или повреждению данных. Кроме того, CLR не может гарантировать, что ваше приложение может продолжать:

исключение SEH является другим классом из этих исключений, поднятых программы. Программа может вызвать исключение, потому что пыталась выполнить поп-элемент из пустого стека или попыталась открыть файл, который не существовал . Все эти исключения имеют смысл в контексте выполнения вашей программы . Исключения SEH относятся к контексту вне вашей программы . В отличие от программных ошибок исключение SEH указывает на то, что целостность процесса выполнения во время работы может быть скомпрометирована.

Просьба ознакомиться с информацией о SEH and CLR exceptions here.

Вот что я не предлагаю вам делать, а для вашей информации: вы можете предотвратить приложение от закрытия после ловли необработанного исключения, обновив app.config файла:

<runtime> 
    <!-- the following setting prevents the host from closing when an unhandled exception is thrown --> 
    <legacyUnhandledExceptionPolicy enabled="1" /> 
</runtime> 

Но, как заявляет Microsoft, если вы игнорируете исключения, приложение может терять ресурсы и блокировать блокировки.

+0

Ну, я понял, поскольку наши редакторы приложений полностью независимы от нашего приложения (из сборки точка зрения). Я подумал, что это может быть не так уж и важно. Идея заключалась в том, чтобы избавиться от редактора и перезагрузить его резервными данными из того момента, когда редактор был открыт. Таким образом, все изменения будут разгоняться. Но я понимаю, что вы не определяете влияние необработанных исключений на хостинг-приложение – derape

+0

@derape, проблема в том, что даже если ваши редакторы или внешние редакторы расположены в разных сборках, все они все еще выполняются в одном исполнении среды и, возможно, даже в одном домене приложения. Таким образом, внешний редактор будет использовать тот же поток пользовательского интерфейса, что и ваши собственные элементы пользовательского интерфейса. Таким образом, «сбой» этого потока вызывает нестабильность во всем приложении, а не только в «сборке их редактора». – dymanoid