Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Как сгенерировать исключение которое не будет приводить к завершению работы приложения?

Для тестирования функционала своего приложения решил написать простенькую тестовую программу с которой будет работать моё приложение.
В тестовой программе необходимо кроме всего прочего генерировать исключение которое не будет приводить к завершению работы приложения.
Вопрос: Как это сделать? Просто вызов throw new Exception() приводит к завершению приложения.
Возможно мой вопрос не совсем понятен, поясню: я запускаю некоторую программу посредством Process.Start(); И перенаправляю на себя StandardError stream. Как выглядит ситуация когда запущенная программа выкидывает эксепшн и закрывается мне ясно и я его обрабатываю. А вот как смоделировать ситуацию когда приложение выкидывает эксепшн и продолжает работу мне неизвестно, собсна в этом и вопрос.
Пример эксепшена: http://blogsisadmina.ru/wp-content/uploads/2013/10/1.png В консольном приложении повторение финта с индексом всё равно приводит к завершению работы приложения.


Ответ

Все исключения должны быть отловлены. Это означает, что где-то в стеке вызовов должен быть try-catch, который проглотит исключение и, например, залогирует его. Хорошим тоном является отлавливание только исключений, которые вы предполагаете, а не просто базового типа исключения, потому что иначе вы можете прозевать проблемную ситуацию и получить повреждение данных где-то в другом месте, в результате поиск проблемы значительно усложнится.
try { DoSomething(); } catch (FooException e) { Log.LogException(e); }
// ...
DoSomething() { throw new FooException(); }
Если вы хотите запрятать от клиентов падучесть приложения и считаете, что важнее отсутствие падений, чем стабильная работа и отсутствие повреждений данных, то можете отлавливать разнообразные события unhandled exception (они есть у домена, задач, диспетчера) и отмечать исключения как обработанные, если это возможно. В этом случае приложение продолжит работать, но за состояние данных никто не будет отвечать.
Dispatcher.CurrentDispatcher.UnhandledException += CurrentDispatcher_UnhandledException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
Если исключения не будет нигде отловлены, то приложение упадёт, и информация об ошибке попадёт с системный журнал. Это не самый удобный способ, но им тоже можно пользоваться.

Комментариев нет:

Отправить комментарий