Exception not catching when using Custom Exception classes in ASP.NET MVC and C#

I have created few custom exception class

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

and here is my controller code

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

I have purposely fully induced an primary key violation exception which is

enter image description here

but exception is not catched by my custom exception class. It is not caught by the last exception catch block.

I cannot understand why so. Can some one help me out on this please.

Jon Skeet
people
quotationmark

The part you've highlighted in the debugger is the inner exception. That isn't used by the CLR to determine which catch block to enter. The outer exception is just a DbUpdateException - which you haven't specified a particular catch block for.

Even the inner exception is just a DataException - it's not an instance of your custom exception.

You haven't shown any code which actually throws your exception - are you sure it's being used at all? What code have you written to tell EF to throw your exception rather than the exception it would otherwise throw?

(Given your comments, I'm not sure you quite understand exception handling. Creating a custom exception doesn't somehow let you catch an instance of that without it being thrown - something still has to throw an instance of that exception before it's any use.)

people

See more on this question at Stackoverflow