Подтвердить что ты не робот

Выполнение нескольких блоков catch

Это немного абстрактно, но есть ли какой-либо возможный способ выбросить исключение и ввести его в несколько блоков catch. IE, если он соответствует конкретному исключению, за которым следуют неспецифические.

catch(Arithmetic exception)
{
  //do stuff
}
catch(Exception exception)
{
  //do stuff
}

Мне НЕ НУЖНО делать это Мне просто нужно это, мне просто интересно, возможно ли это.

4b9b3361

Ответ 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 и выполнить какую-либо конкретную обработку, прежде чем продолжить работу с остальной частью блока.

ИЗМЕНИТЬ

Я собирался вставить образец кода, но я вижу, что Киралесса уже сделала это: -)