如何检查在catch块中引发的异常类型?

时间:2020-05-06 12:10:47

标签: c# exception try-catch sqlexception catch-block

我有这样的东西:

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

      }
      else if (ex is SqlException)
      {

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

C#中的权利是这样吗?is到底是什么意思,这是它的作用还是另外一种方式?

3 个答案:

答案 0 :(得分:3)

是的,还有另一种方法。通过调用在运行代码块时可能发生的特定异常:

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

}
catch(AnotherException ex) {

}

那么从最具体的异常开始并逐步发展为一般异常非常重要。

答案 1 :(得分:2)

多个捕获块是一个答案(docs):

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

您可以在try块之后添加任意数量的

UPD 正如在此答案的注释中所添加的那样,顺序很重要,因此,如果您有异常层次结构,请先捕获派生的异常。

答案 2 :(得分:2)

经典选项:

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);
    }
}