1

I got an error on the creation of an api controller due to that I didn't set up autofac for webapi.

However, I can't seem to catch the exception anywhere.

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Type 'MyWeb.Web.Controllers.MyController' does not have a default constructor
</ExceptionMessage>
<ExceptionType>System.ArgumentException</ExceptionType>
<StackTrace>
at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
</StackTrace>
</Error>

I tried adding WebApi contrib for Elmah, then I added this:

config.Filters.Add(new Elmah.Contrib.WebApi.ElmahHandleErrorApiAttribute());

Didn't make elmah register the exception. I added the following to global.asax:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
}

Didn't make any difference at all.

How can I handle errors happening before the controllers are called?

1 Answer 1

1

I wonder if this exception is just being added to the content of the HttpResponseMessage but is not actually being thrown as an exception. When implementing a dependency resolver class for use during constructor instantiation, it usually makes sense to attempt resolution, catch exceptions and return null.

For example, in non-API MVC controllers I've often used something like this:

public class UnityDependencyResolver : IDependencyResolver
{
    public readonly IUnityContainer Container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        Container = container;
    }

    #region IDependencyResolver Members

    public object GetService(Type serviceType)
    {
        try
        {
            return Container.Resolve(serviceType);
        }
        catch (Exception ex)
        {
            if (ex.InnerException is TypeInitializationException)
                throw ex.InnerException;

            return null;
        }
    }
    ...
Sign up to request clarification or add additional context in comments.

1 Comment

It makes sense if it does. I'll have to read up on the mvc source soon.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.