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


80

我有一段try catch代码:

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

对于这段代码,我试图将记录插入数据库:dba对其进行了设置,以便数据库检查重复项,如果存在重复项,则返回错误。如您所见,当前,无论发生什么错误,我都将相同的错误添加到模型中。我希望它已更改,因此,如果该错误是由dba设置的重复错误引起的,则仅将其添加到模型中。

以下是我要捕获的错误。请注意,这是内部异常。谁能告诉我如何特别抓到这个?

在此处输入图片说明


1
请参阅Davide的答案。通常,捕获Exception不是最佳实践。您应该尽可能具体,让您无法处理的任何事情都引起用户/框架的注意。
瑞安

Answers:


139

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

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}

在C#6中,您可以执行以下操作:

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}

2
是否有“何时不”的语法?
conterio

2
@conteriocatch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
汤姆(Tom),

15

替换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
    }
}

3

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

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

2
通过字符串比较异常类型很危险。不幸的拼写错误会使异常处理成为噩梦!
Tejas Pendse

同意 比较类型与类型。exc.GetType()== typeof(YourException)
Lee Oades

2

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

是否有“何时不”的语法?

有。

catch (Exception e) when (!(e is ArgumentException)) { }

-3

您可以看一下SQLException类-并检查异常消息的内容是否包含您现在在内部异常中看到的内容。

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}

1
我怀疑SqlException是直接引发的,但仅作为内部异常抛出。同样,检查错误号可能比与消息文本进行比较可能更好。
约翰·桑德斯

是的,您也可以检查错误号。感谢您的评论。
Ann BG'2

如何检查错误号?我什至不确定这是什么数字,因为这是一个真正的错误?
AnonyMouse 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.