Для тестирования функционала своего приложения решил написать простенькую тестовую программу с которой будет работать моё приложение.
В тестовой программе необходимо кроме всего прочего генерировать исключение которое не будет приводить к завершению работы приложения.
Вопрос: Как это сделать? Просто вызов 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;
Если исключения не будет нигде отловлены, то приложение упадёт, и информация об ошибке попадёт с системный журнал. Это не самый удобный способ, но им тоже можно пользоваться.
Комментариев нет:
Отправить комментарий