#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:Ну а поскольку мой вопрос был весьма сумбурным и лейб мотивом всё же была обработка и перехват эксепшенов То в качестве верного ответа я, пожалуй, укажу самый популярный на текущий момент ответ. Для большинства приходящих судя из гугла это будет то, что нужно, а тем кто будет искать ответ на тот же вопрос что и я не составит труда прочесть все комментарии
Комментариев нет:
Отправить комментарий