在我的ASP.NET MVC 3应用程序中,我使用EF 4.2。在我的数据库中,我对列有一个唯一的约束。
我尝试插入相同的数据以查看我得到的内容但是我收到以下错误:
更新条目时发生错误。查看内部异常 详情。
在内部异常内部,我可以看到有关唯一约束的完整错误。但是,如何才能唯一地捕获此异常以告诉用户:
您再次输入相同的值。
以下是我目前所做的事情:
try
{
UpdateModel<ConditionType>(conditionType, null, null, new string[] { "ConditionTypeId" });
_conditionTypeRepository.Save();
return RedirectToAction("conditiontype");
}
catch (Exception ex)
{
ModelState.AddModelError("", "There was an error while updating: " + ex.Message);
}
但这是一种通用方法。我想做的是提供一个特定的信息。
有什么想法吗?
修改
我厌倦了下面但是这次它没有抓住它:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
ModelState.AddModelError("", "You are entering the same value again.");
}
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
我挖了一点,结果发现它抛出了一个不包含异常编号的异常类型System.Data.Entity.Infrastructure.DbUpdateException
。
修改
这里我如何解决问题,但我相信这不是解决问题的最佳方法。知道如何重构这段代码吗?
catch (Exception ex) {
if (ex.InnerException.InnerException.GetType() == typeof(SqlException)) {
if (((SqlException)ex.InnerException.InnerException).Number == 2627)
ModelState.AddModelError("", "You are entering the same value again.");
else
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
} else {
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
}
答案 0 :(得分:3)
你可以做这样的事情来寻找一个SqlException的内部异常,然后以不同的方式处理sql异常。
catch(Exception ex)
{
Exception current = ex;
SqlException se = null;
do
{
se = current.InnerException as SqlException;
current = current.InnerException;
}
while (current != null && se == null);
if (se != null)
{
// Do your SqlException processing here
}
else
{
// Do other exception processing here
}
}
答案 1 :(得分:1)
也可以使用GetBaseException()方法,因为这会导致根本原因异常,即SqlException。
答案 2 :(得分:0)
要获得最里面的异常,你可以这样做:
SqlException se = null;
Exception next = ex;
while (next.InnerException != null)
{
se = next.InnerException as SqlException;
next = next.InnerException;
}
if (se != null)
{
// Do your SqlException processing here
}
else
{
// Do other exception processing here
}