--- uid: web-api/overview/error-handling/exception-handling title: "Exception Handling in ASP.NET Web API | Microsoft Docs" author: MikeWasson description: "" ms.author: aspnetcontent ms.date: 03/12/2012 ms.assetid: cbebeb37-2594-41f2-b71a-f4f26520d512 msc.legacyurl: /web-api/overview/error-handling/exception-handling msc.type: authoredcontent --- Exception Handling in ASP.NET Web API ==================== by [Mike Wasson](https://github.com/MikeWasson) This article describes error and exception handling in ASP.NET Web API. - [HttpResponseException](#httpresponserexception) - [Exception Filters](#exception_filters) - [Registering Exception Filters](#registering_exception_filters) - [HttpError](#httperror) ## HttpResponseException What happens if a Web API controller throws an uncaught exception? By default, most exceptions are translated into an HTTP response with status code 500, Internal Server Error. The **HttpResponseException** type is a special case. This exception returns any HTTP status code that you specify in the exception constructor. For example, the following method returns 404, Not Found, if the *id* parameter is not valid. [!code-csharp[Main](exception-handling/samples/sample1.cs)] For more control over the response, you can also construct the entire response message and include it with the **HttpResponseException:** [!code-csharp[Main](exception-handling/samples/sample2.cs)] ## Exception Filters You can customize how Web API handles exceptions by writing an *exception filter*. An exception filter is executed when a controller method throws any unhandled exception that is *not* an **HttpResponseException** exception. The **HttpResponseException** type is a special case, because it is designed specifically for returning an HTTP response. Exception filters implement the **System.Web.Http.Filters.IExceptionFilter** interface. The simplest way to write an exception filter is to derive from the **System.Web.Http.Filters.ExceptionFilterAttribute** class and override the **OnException** method. > [!NOTE] > Exception filters in ASP.NET Web API are similar to those in ASP.NET MVC. However, they are declared in a separate namespace and function separately. In particular, the **HandleErrorAttribute** class used in MVC does not handle exceptions thrown by Web API controllers. Here is a filter that converts **NotImplementedException** exceptions into HTTP status code 501, Not Implemented: [!code-csharp[Main](exception-handling/samples/sample3.cs)] The **Response** property of the **HttpActionExecutedContext** object contains the HTTP response message that will be sent to the client. ## Registering Exception Filters There are several ways to register a Web API exception filter: - By action - By controller - Globally To apply the filter to a specific action, add the filter as an attribute to the action: [!code-csharp[Main](exception-handling/samples/sample4.cs)] To apply the filter to all of the actions on a controller, add the filter as an attribute to the controller class: [!code-csharp[Main](exception-handling/samples/sample5.cs)] To apply the filter globally to all Web API controllers, add an instance of the filter to the **GlobalConfiguration.Configuration.Filters** collection. Exeption filters in this collection apply to any Web API controller action. [!code-csharp[Main](exception-handling/samples/sample6.cs)] If you use the "ASP.NET MVC 4 Web Application" project template to create your project, put your Web API configuration code inside the `WebApiConfig` class, which is located in the App\_Start folder: [!code-csharp[Main](exception-handling/samples/sample7.cs?highlight=5)] ## HttpError The **HttpError** object provides a consistent way to return error information in the response body. The following example shows how to return HTTP status code 404 (Not Found) with an **HttpError** in the response body. [!code-csharp[Main](exception-handling/samples/sample8.cs)] **CreateErrorResponse** is an extension method defined in the **System.Net.Http.HttpRequestMessageExtensions** class. Internally, **CreateErrorResponse** creates an **HttpError** instance and then creates an **HttpResponseMessage** that contains the **HttpError**. In this example, if the method is successful, it returns the product in the HTTP response. But if the requested product is not found, the HTTP response contains an **HttpError** in the request body. The response might look like the following: [!code-console[Main](exception-handling/samples/sample9.cmd)] Notice that the **HttpError** was serialized to JSON in this example. One advantage of using **HttpError** is that it goes through the same [content-negotiation](../formats-and-model-binding/content-negotiation.md) and serialization process as any other strongly-typed model. ### HttpError and Model Validation For model validation, you can pass the model state to **CreateErrorResponse**, to include the validation errors in the response: [!code-csharp[Main](exception-handling/samples/sample10.cs)] This example might return the following response: [!code-console[Main](exception-handling/samples/sample11.cmd)] For more information about model validation, see [Model Validation in ASP.NET Web API](../formats-and-model-binding/model-validation-in-aspnet-web-api.md). ### Using HttpError with HttpResponseException The previous examples return an **HttpResponseMessage** message from the controller action, but you can also use **HttpResponseException** to return an **HttpError**. This lets you return a strongly-typed model in the normal success case, while still returning **HttpError** if there is an error: [!code-csharp[Main](exception-handling/samples/sample12.cs)]