【问题标题】:How to check the types of Exceptions thrown in a catch block?如何检查 catch 块中抛出的异常类型?
【发布时间】:2020-05-06 12:10:47
【问题描述】:

我有这样的事情:

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

      }
      else if (ex is SqlException)
      {

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

这在C# 中是否正确,is 到底是什么意思,这是它的作用还是有其他方式?

【问题讨论】:

  • 你可以有多个 catch 块:catch(MyException1 ex){...}catch(MyException2 ex){...}
  • @GuruStron,怎么做?

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


【解决方案1】:

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

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

}
catch(AnotherException ex) {

}

那么从最具体的例外开始,然后朝着一般例外的方向努力是非常重要的。

【讨论】:

【解决方案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);
    }
}

【讨论】:

    【解决方案3】:

    多个 catch 块是一个答案(docs):

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

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

    UPD 正如在 cmets 中添加到这个答案 - 顺序很重要,所以如果你有异常层次结构首先捕获派生的。

    【讨论】:

    • 注意:如果一种异常类型派生自另一种异常类型,顺序将很重要。例如:如果你的 first catch 块捕获了Exception,那将是唯一会被命中的。
    • @Fildor 我认为现在的编译器非常擅长确定大多数此类情况 =) 但是是的,有效点。
    • @GuruStron 不在这种特殊情况下
    • @GuruStron 我想可能应该有一个警告,是的。不过不确定。
    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2016-11-13
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多