Global Exception Handling in ASP.NET Core WEB API

Exception handling is one of the most important part of any application that needs to addressed and implemented properly. With ASP.NET Core, things have changed and are in better shape to implement exception handling. Implementing exception handling for every action method in API, is quite time-consuming and requires extra efforts. So in this post, find out how to implement global exception handling in ASP.NET Core WEB API.

The benefit of implementing global exception handling is that you need to implement in at one place. Any exception occurs in your application will be handled, even when you add new controllers or new methods. That’s cool. Isn’t it? Let’s see how to implement it.

Global Exception Handling in ASP.NET Core WEB API

There are a couple of ways to implement exception handling globally. You might know the introduction of Middleware in ASP.NET Core and ASP.NET Core is shipped with some inbuilt middleware components. And one of the inbuilt ASP.NET Core diagnostic middleware is UseExceptionHandler. Read more about Various ASP.NET Core Diagnostics Middleware

The middleware UseExceptionHandler can be used to handle exceptions globally. You can get all the details of the exception object (Stack Trace, Inner exception, message etc..) and display them on-screen. You can implement like this.

You need to put this inside configure() of startup.cs file. Let’s throw some exception to test it. I am using the default template of ASP.NET Core Web API project. So open ValuesController.cs, modify the Get() method to throw an exception.

Here, the code checks for the exception type and set the message and status properties accordingly. You will see a custom exception type MyAppException (line no. 19) is also used. You can create a custom exception class via inheriting the Exception class.

Summary

To conclude, this post shows 2 different approaches for handling exception globally either via inbuilt middleware or using an exception filter. The post also talks about creating a custom exception class to help you create your own custom exceptions based on the requirements.

Thank you for reading. Keep visiting this blog and share this in your network. Please put your thoughts and feedback in the comments section.

PS: If you found this content valuable and want to return the favour, then

It seems you have an interface with the name IExceptionFilter.cs in interfaces folder of your project. Due to the same interface names this error is coming. You should avoid using inbuilt interfaces names while creating your custom interface. There are 2 fixes for this:
1. Change the name of your custom interface
2. Or Use complete interface namespace while inheriting.

Yes. Its working fine when we change like this in .Net Core
namespace Microsoft.AspNetCore.Mvc.Filters
{
public interface IExceptionFilter : IExceptionFilter // IFilterMetadata
{
void OnException(ExceptionContext context);
}
}
and when we run through swagger/getaway , Exception is not returning.. Just we got response as no content.. I think it seems to be becoz of this line response.WriteAsync(err).. any idea?? But its working fine without swagger/gateway integration…. Pls sugget.. thanks MK….

The CustomExceptionFilter example doesn’t appear to work reliably with asp.net core webapi project: With Postman or with Integration tests via System.Net.HTTP.HttpClient. In both cases there are errors, in Postman it says there is no response, in XUnit tests it has a similar error saying it could not process the response. Whereas in Swagger API console it *does* appear to work for some unknown reason.

I’m guessing the response is not being sent properly but I can’t see why, might be time to break out fiddler on this one.

This is really good, thanks for sharing. Just a quick thought about this: “var err = message + ” ” + context.Exception.StackTrace;”
You’re returning the full stack trace to the client here. That’s not generally going to be good practice. Depending on the severity of the exception, it might be better to log that to a file instead of including it with your response.
Also, is this the best practice for calling an async method within a synchronous method? It might be relatively safe in this case, but you can be at risk of deadlock calling async code like this. It might be better to call .Wait() as well (and specify a short timeout as this method call should execute very quickly).

I can’t seem to be able to my web api to throw exception through AJAX request.
I get “net::ERR_INCOMPLETE_CHUNKED_ENCODING” in Chrome Console Log.
I’m not about to catch the error status code and message with jqXHR

However, if I directly access the api url in the browser, the exception message can be displayed in view.

“`app.UseExceptionHandler()“` I am getting a red squiggle. I don’t know what to import.
can you help me .

I code in Visual Studio Code. I am learning by doing things manually. All By Myself. But Doing things Manually is a cumbersome process. Can you please give me series of blog posts or tutorial about this topic.

You need to add “Microsoft.AspNetCore.Diagnostics”: “1.0.0” nuget package to use app.UseExceptionHandler();. I also did a post about various ASP.NET core diagnostic middleware to show how to use them. Please take a look.