Как проверить типы исключений, добавленных в блок catch? - PullRequest
0 голосов
/ 06 мая 2020

У меня что-то вроде этого:

catch (Exception ex)
 {
      if (ex is "Exception Type")
      {

      }
      else if (ex is SqlException)
      {

      }
      else if 
      {
        ...
        ...
        ...
 }

Правильно ли это в C# и что в любом случае означает is, какова его роль или есть другой способ?

Ответы [ 3 ]

3 голосов
/ 06 мая 2020

Да, есть другой способ. Вызывая определенные c исключения, которые могут возникнуть при запуске блока кода:

try {
   // Do something
}
catch(SqlException ex) {

}
catch(AnotherException ex) {

}

Затем очень важно начать с наиболее специфичного c исключения и продвигаться к общему исключение.

2 голосов
/ 06 мая 2020

Classi c вариант:

try
{
    return DoStuff();    
}
catch (InvalidOperationException opEx)
{
    return HandleInvalidOp(opEx);
}
catch (DivideByZeroException divEx)
{
    return HandleDivException(divEx);
}
catch (Exception ex)  // final catch-all
{
    return HandleEx(ex);
}

Использование переключателя сопоставления с образцом:

try
{
    return DoStuff();
}
catch (Exception ex)
{
    switch (ex)
    {
        case InvalidOperationException opEx:
            return HandleInvalidOp(opEx);
        case DivideByZeroException divEx:
            return HandleDivException(divEx);
        default:
            return HandleEx(ex);
    }
}
2 голосов
/ 06 мая 2020

Несколько блоков catch - это ответ ( docs ):

try
{
}
catch (SqlException ex)
{
    ...    
}
catch(AnotherExceptionType ex)
{
     ...
}

вы можете добавить любое количество блоков после try блока.

UPD Как добавлено в комментариях к этому ответу - порядок важен, поэтому, если у вас есть иерархия исключений, сначала ловите производные.

...