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