Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Application_Error in global.asax not catching errors in WebAPI

For a project I am working on, one of the things we're implementing is something that we have code for in some of my teams older ASP.NET and MVC projects - an Application_Error exception catcher that dispatches an email to the development team with the exception experience and most relevant details.

Here's how it looks:

Global.asax:

protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    string path = "N/A";
    if (sender is HttpApplication)
        path = ((HttpApplication) sender).Request.Url.PathAndQuery;

    string args = string.Format("<b>Path:</b> {0}", path);

    // Custom code that generates an HTML-formatted exception dump
    string message = Email.GenerateExceptionMessage(ex, args);

    // Custom code that sends an email to the dev team.
    Email.SendUnexpectedErrorMessage("Some App", message);
}

One "minor" problem, though - when I intentionally have a part of the code throw an exception in order to test this mechanism...

public static void GetMuffinsByTopping(string topping)
{
    throw new Exception("Test Exception!", new Exception("Test Inner Exception!!!"));

    // Actual repository code is unreachable while this test code is there
}

The front-end JavaScript is immediately intercepting an HTTP 500 request, but the global.asax.cs code noted above is not being reached (I set a breakpoint on the first executing line of the method.)

Question: In what way can I get the "old" Application_Error handler to dispatch error emails, so that our team's developers can more easily debug our application?

like image 546
Andrew Gray Avatar asked Feb 27 '15 15:02

Andrew Gray


People also ask

How does Web API handle application error global ASAX?

Application Level Error Handling You can handle default errors at the application level either by modifying your application's configuration or by adding an Application_Error handler in the Global. asax file of your application. You can handle default errors and HTTP errors by adding a customErrors section to the Web.

How does MVC handle application error in global ASAX?

Perhaps a better way of handling errors in MVC is to apply the HandleError attribute to your controller or action and update the Shared/Error. aspx file to do what you want. The Model object on that page includes an Exception property as well as ControllerName and ActionName.


1 Answers

Abstract out your error handling logic from Application_Error into its own function. Create a Web API exception filter.

//register your filter with Web API pipeline //this belongs in the Application_Start event in Global Application Handler class (global.asax) //or some other location that runs on startup GlobalConfiguration.Configuration.Filters.Add(new LogExceptionFilterAttribute());  //Create filter public class LogExceptionFilterAttribute : ExceptionFilterAttribute  {     public override void OnException(HttpActionExecutedContext context)     {         ErrorLogService.LogError(context.Exception);     } }  //in global.asax or global.asax.cs protected void Application_Error(object sender, EventArgs e) {     Exception ex = Server.GetLastError();     ErrorLogService.LogError(ex); }   //common service to be used for logging errors public static class ErrorLogService {     public static void LogError(Exception ex)     {         //Email developers, call fire department, log to database etc.     } } 

Errors from Web API do not trigger the Application_Error event. But we can create an exception filter and register it to handle the errors. Also see Global Error Handling in ASP.NET Web API 2.

like image 90
mason Avatar answered Oct 04 '22 11:10

mason