我有一个尝试捕获代码:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
对于这段代码,我尝试将记录插入数据库:dba已设置它,以便数据库检查重复项,如果有重复项则返回错误。目前,正如您所看到的,无论发生什么错误,我都会向模型添加相同的错误。我希望它被更改,因此如果它是由dba设置的重复错误引起的,则此错误仅添加到模型中。
以下是我想要捕获的错误。注意它在内部异常中。谁能告诉我如何专门捕获这个?
答案 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
}
}