如何确定异常是否属于特定类型

Ano*_*use 72 c# asp.net-mvc exception-handling

我有一块try catch代码:

try 
{
    ...
}
catch(Exception ex) 
{
    ModelState.AddModelError(
        "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
Run Code Online (Sandbox Code Playgroud)

对于这段代码,我正在尝试将记录插入到数据库中:dba已将其设置为以便数据库检查重复项,如果存在重复项则返回错误.目前,正如您所看到的,无论发生什么错误,我都会向模型添加相同的错误.我希望它改变,所以如果这个错误是由dba设置的重复错误引起的,那么这个错误只会添加到模型中.

以下是我想要捕捉的错误.注意它在内部异常中.谁能告诉我如何专门捕捉这个?

在此输入图像描述

Dav*_*ras 125

当前捕获之前添加以下内容:

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}
Run Code Online (Sandbox Code Playgroud)

从C#6开始,您可以执行以下操作:

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}
Run Code Online (Sandbox Code Playgroud)

  • 是否有“何时不”的语法? (2认同)
  • @conterio`catch(DbUpdateException ex)when(!(ex.InnerException是UpdateException))` (2认同)

Nis*_*tha 14

替换System.Threading.ThreadAbortException为您的例外.

try
{
    //assume ThreadAbortException occurs here
}
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException)))
    {
         //what you want to do when ThreadAbortException occurs         
    }
    else
    {
         //do when other exceptions occur
    }
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 12

没有足够的代表发表评论。回应@conterio问题(在@Davide Piras回答中):

是否有一个“何时不”语法?

有。

catch (Exception e) when (!(e is ArgumentException)) { }
Run Code Online (Sandbox Code Playgroud)


小智 10

要获取异常的名称,您可以使用

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }
Run Code Online (Sandbox Code Playgroud)

  • 通过字符串比较异常类型是危险的。不幸的拼写错误将使异常处理成为一场噩梦! (2认同)