在ASP.NET MVC和C#中使用自定义异常类时没有捕获异常

时间:2014-07-31 05:44:59

标签: c# asp.net asp.net-mvc entity-framework

我创建了一些自定义异常类

public class CreateNewUserWebException : Exception
{
    public CreateNewUserWebException(string email): base(
        string.Format("[{0}] - User could not be added.", email))
    {
    }
}
public class CreateNewUserEntityFrameworkException : System.Data.DataException
{
    public CreateNewUserEntityFrameworkException(string email)
        : base(
            string.Format("[{0}] - User could not be added.", email))
    {
    }
}

这是我的控制器代码

try
{
    var user = _createUserModule.CreateUser(model);
    CookieManager.SetAuthenticationCookie(user, model.Email, rememberMe: false);
    return RedirectToAction("Index", "Bugs");
}
catch (CreateNewUserEntityFrameworkException exception)
{
    this.ModelState.AddModelError("", "Some error occured while registering you on our sytem. Please try again later.");
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
}
catch (CreateNewUserWebException exception)
{
    this.ModelState.AddModelError("", "Some error occured while registering you on our sytem. Please try again later.");
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
}
catch(Exception exception)
{
    this.ModelState.AddModelError("", "Some error occured while registering you on our sytem. Please try again later.");
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
}

我故意完全引发了主键违规异常

enter image description here

但我的自定义异常类没有捕获异常。它不会被最后一个异常catch块捕获。

我无法理解为什么会这样。有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您在调试器中突出显示的部分是内部异常。 CLR不会使用它来确定要输入的catch块。外部异常仅为DbUpdateException - 您尚未为其指定特定的catch块。

即使内部异常只是DataException - 它也不是您的自定义异常的实例。

您还没有显示任何实际抛出您的例外的代码 - 您确定它已经被使用了吗?你写了什么代码告诉EF抛出你的异常而不是它会抛出的异常?

(鉴于你的评论,我不确定你是否完全理解异常处理。创建一个自定义异常并不能以某种方式让你捕获它的实例而不抛出它 - 仍然需要抛出一个实例在任何使用之前的例外情况。)