Выполнение нескольких блоков catch
Это немного абстрактно, но есть ли какой-либо возможный способ выбросить исключение и ввести его в несколько блоков catch. IE, если он соответствует конкретному исключению, за которым следуют неспецифические.
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
Мне НЕ НУЖНО делать это Мне просто нужно это, мне просто интересно, возможно ли это.
Ответы
Ответ 1
Совершенно допустимо иметь несколько блоков catch разных типов. Однако поведение состоит в том, что первый блок-кандидат обрабатывает исключение.
Он не войдет в блоки блокировки BOTH. Первый блок catch, который соответствует типу исключения, будет обрабатывать это конкретное исключение, а не другие, даже если он будет возвращен в обработчик. Любые последующие будут пропущены после того, как исключение войдет в блок catch.
Чтобы исключение попало в BOTH-блоки, вам нужно либо вложить блоки следующим образом:
try
{
try
{
// Do something that throws ArithmeticException
}
catch(ArithmeticException arithException)
{
// This handles the thrown exception....
throw; // Rethrow so the outer handler sees it too
}
}
catch (Exception e)
{
// This gets hit as well, now, since the "inner" block rethrew the exception
}
Кроме того, вы можете фильтровать в общем обработчике исключений на основе определенного типа исключения.
Ответ 2
Нет. Невозможно выполнить код в обоих блоках catch для одного исключения.
Я бы, вероятно, реорганизовал код в общем блоке исключений в то, что можно вызвать из.
try
{
// blah blah blah
{
catch(Arithmetic ae)
{
HandleArithmeticException( ae );
HandleGenericException( ae );
}
catch(Exception e)
{
HandleGenericException( e );
}
Ответ 3
Если вы использовали VB.NET, вы могли бы абстрагировать обработчик ошибок в исключении Arithmatic в вызове функции или метода, который всегда возвращает false.
Тогда вы могли бы написать что-то вроде:
Поймать ex как арифметику, когда HandleArithmetic()
Catch ex as Exception
Завершить попытку
Не то, чтобы я выступал за такое использование, хотя я видел, как он рекомендовал для ведения журналов раньше. Я не верю, что есть С# equivilent.
Ответ 4
У вас не может быть более одного блока исключений, обрабатывающих одно и то же исключение. Но то, что вы можете сделать, это уловить общее исключение, а затем попытаться применить к более конкретному, например:
catch (Exception exception)
{
var aex = exception as ArithmeticException
if (aex != null)
{
// do stuff specific to this exception type
}
// then do general stuff
}
Ответ 5
Как и другие, исключение будет зависеть от самого конкретного блока catch.
Это вызывает разочарование, хотя и с обработкой исключений. Хотелось бы, чтобы вы могли сделать что-то вроде
catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{
}
Вместо того, чтобы делать
catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}
Я понимаю аргументы против этого, что вы, вероятно, делаете разные вещи для разных исключений, но иногда я хочу объединить их.
Ответ 6
Это называется фильтрацией исключений и не поддерживается в С# (мне говорят, что это возможно в VB.Net).
Одна работа должна состоять в том, чтобы поймать общее исключение, а затем проверить тип исключения в блоке catch и выполнить какую-либо конкретную обработку, прежде чем продолжить работу с остальной частью блока.
ИЗМЕНИТЬ
Я собирался вставить образец кода, но я вижу, что Киралесса уже сделала это: -)