Продолжить выполнение программы даже после попытки catch - PullRequest
2 голосов
/ 29 декабря 2010

Когда я использую команду try, catch, если возникает какое-либо исключение, выполнение программы останавливается после обработки catch. Но мне нужно продолжить выполнение программы, даже если есть исключение. Может ли кто-нибудь помочь мне, как это сделать?

Ответы [ 4 ]

9 голосов
/ 29 декабря 2010

Неполученные исключения прекращают выполнение.

Если исключение перехватывается и не перебрасывается, выполняется условие catch (), затем предложение finally () (если оно есть) и выполнение затем продолжается с оператором, следующим за блоком try / catch / finally.

Если исключение перехватывается и перебрасывается, предложение catch () выполняется вплоть до оператора throw; предложение finally () (если оно есть) выполняется), затем генерируется исключение (пере), и разматывание стека продолжается.

Поскольку стек вызовов разматывается, предложения finally () выполняются по мере того, как они выходят из области видимости, а Dispose () вызывается, когда переменные, объявленные в операторах использования, выходят из области видимости.

Чего не происходит, так это того, что управление не возобновляется (и не может) возобновиться с того момента, когда было сгенерировано исходное исключение. Похоже, вы перехватываете исключения на высоком уровне, например, свой метод Main (), и ожидаете продолжения выполнения в исходной точке сбоя.

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

Выполнить обработку исключений довольно сложно; следовательно, изречение о том, что лучшая практика обработки исключений - не обрабатывать ее. Исключения должны быть именно такими: исключительные. Ваш код не должен выбрасывать исключение, как обычно; Вы также не должны обычно использовать исключения в качестве метода проверки или в качестве оператора потока управления.

7 голосов
/ 29 декабря 2010

Если я правильно понимаю, вот что вы хотите:

try
{
    Statement1(); // <-- Exception is thrown in here
    Statement2(); // <-- You want to go here after the catch block executes
}
catch
{
    HandleException();
}

Блоки try / catch не работают таким образом.Вместо этого вам придется переписать свой код следующим образом:

try
{
    Statement1();
}
catch
{
}


try
{
    Statement2();
}
catch
{
}
3 голосов
/ 29 декабря 2010

Если вы обрабатываете исключение и не перебрасываете его (или другое исключение) из блока catch, ваша программа должна возобновиться.

Кроме того, если вы перехватываете исключения определенного типа (скажем, исключения IO), но код в блоке try выдает другой тип (скажем, исключение SQL), ваш блок catch не может его перехватить и исключение будет пузыриться до завершения программы.

Что именно вы делаете в своих catch блоках?

2 голосов
/ 29 декабря 2010

Если вы говорите о функции (не о программе), вы можете использовать, наконец, для продолжения вашей функции

try
{

}
catch(MyException ex)
{

}
finally
{
 // other code to be done
}

, но если вы говорите, что программа падает, то cach без аргументов может обработать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...