Страницы

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

среда, 18 декабря 2019 г.

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

#c_sharp #net #visual_basic


Для тестирования функционала своего приложения решил написать простенькую тестовую
программу с которой будет работать моё приложение. 

В тестовой программе необходимо кроме всего прочего генерировать исключение которое
не будет приводить к завершению работы приложения. 

Вопрос: Как это сделать? Просто вызов throw new Exception() приводит к завершению
приложения.

Возможно мой вопрос не совсем понятен, поясню: я запускаю некоторую программу посредством
Process.Start(); И перенаправляю на себя StandardError stream. Как выглядит ситуация
когда запущенная программа выкидывает эксепшн и закрывается мне ясно и я его обрабатываю.
А вот как смоделировать ситуацию когда приложение выкидывает эксепшн и продолжает работу
мне неизвестно, собсна в этом и вопрос.

Пример эксепшена: http://blogsisadmina.ru/wp-content/uploads/2013/10/1.png 
В консольном приложении повторение финта с индексом всё равно приводит к завершению
работы приложения.
    


Ответы

Ответ 1



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

Ответ 2



Используйте try {..} catch(){} В блоке try вбрасываете исключение, с catch его ловите. int a = 5; try { if (a == 5) { throw new Exception("a > 5!"); } } catch(Exception e) { Console.WriteLine("Возникла ошибка!"); } Обратите внимание, что тип ошибки вбрасываемой ошибки должен совпадать с типом перехватываемой ошибки. Подробнее про try/catch: MSDN

Ответ 3



В общем я видимо только всех запутал... Мне необходимо было сгенерить подобный эксепшн: http://blogsisadmina.ru/wp-content/uploads/2013/10/1.png Проблема заключалась в том, что в консольном приложении генерация любого не перехваченного эксепшена приводила к завершению работы. И связано это судя по всему с тем, в какой поток консоль пишет исключения. Решение проблемы: использовать не консольное а winforms/wpf приложение. В этом случае любой эксепшн (ну или почти любой, все не проверял) выдаст требуемое окно с вариантом "продолжить". PS:Ну а поскольку мой вопрос был весьма сумбурным и лейб мотивом всё же была обработка и перехват эксепшенов То в качестве верного ответа я, пожалуй, укажу самый популярный на текущий момент ответ. Для большинства приходящих судя из гугла это будет то, что нужно, а тем кто будет искать ответ на тот же вопрос что и я не составит труда прочесть все комментарии

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

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