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

时间:2012-02-14 00:15:32

标签: c# asp.net-mvc exception-handling

我有一个尝试捕获代码:

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

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

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

enter image description here

5 个答案:

答案 0 :(得分:110)

在当前捕获之前

添加以下内容:

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...
}

答案 1 :(得分:10)

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

答案 2 :(得分:0)

你的意思是

catch (Exception e){
    if ( e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException")
    //if (e.GetType().Name == .....)
}

答案 3 :(得分:0)

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

  

是否存在“当不”语法?

有。

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

答案 4 :(得分:-3)

您可以查看SQLException类 - 如果它包含您在内部异常中看到的内容,则检查异常消息的内容。这样的事情:

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