CustomExceptionMiddleware 1.3.0
dotnet add package CustomExceptionMiddleware --version 1.3.0
NuGet\Install-Package CustomExceptionMiddleware -Version 1.3.0
<PackageReference Include="CustomExceptionMiddleware" Version="1.3.0" />
paket add CustomExceptionMiddleware --version 1.3.0
#r "nuget: CustomExceptionMiddleware, 1.3.0"
// Install CustomExceptionMiddleware as a Cake Addin #addin nuget:?package=CustomExceptionMiddleware&version=1.3.0 // Install CustomExceptionMiddleware as a Cake Tool #tool nuget:?package=CustomExceptionMiddleware&version=1.3.0
Custom Exception Middleware
It is a middleware for error handling in ASP.NET projects, the application aims to facilitate and handle when an accidental or custom exception occurs in the project.
Install
Package Manager Console
Install-Package CustomExceptionMiddleware
.Net CLI
dotnet add package CustomExceptionMiddleware
Minimum requirements to use: .NET Standard 2.0
Compilation requirements: .NET 8
How to use
It's very simple to use, go to Startup.cs
on Configure()
method and add this code:
app.UseCustomExceptionMiddleware();
Or if you are using any of the newer versions of .NET put the code after the app build
on Program.cs
file.
var app = builder.Build();
app.UseCustomExceptionMiddleware();
Example output
{
"type": "VALIDATION_ERRORS",
"error": {
"msg": "Custom domain exception message"
}
}
Custom use
Create object options: It's possible create a
CustomExceptionOptions
to customize the return middleware object, to view theStackTrace
like this:app.UseCustomExceptionMiddleware(new CustomExceptionOptions { ViewStackTrace = true });
Use an action options: Other options to customize the return object is using an action to create a
CustomErrorModel
app.UseCustomExceptionMiddleware(options => { options.ViewStackTrace = true; });
In both cases the output will include de stack trace in detail
object property:
Example output
{
"type": "VALIDATION_ERRORS",
"error": {
"msg": "Custom domain exception message",
"detail": "at CustomExceptionMiddleware.WebAppTest.Custom.ProductService.GetDomainException(Boolean returnProducts) in C:\\isaacnborges\\projects\\custom-exception-middleware\\tests\\CustomExceptionMiddleware.WebAppTest.Custom\\ProductService.cs:line 18\r\n at CustomExceptionMiddleware.WebAppTest.Custom.Controllers.ProductController.GetDomain(Boolean returnProduct) in C:\\isaacnborges\\projects\\custom-exception-middleware\\tests\\CustomExceptionMiddleware.WebAppTest.Custom\\Controllers\\ProductController.cs:line 26"
},
}
Configure Exceptions
This middleware use some custom exceptions to catch and personalize the response status code.
The custom middleware supports the following Exceptions:
Exception Status code description Status code
--------------------- ----------------------- -----------
DomainException BadRequest 400
UnauthorizedException Unauthorized 401
CannotAccessException Forbidden 403
NotFoundException NotFound 404
Exception InternalServerError 500
DomainException
is an abstract exception, so to use it's necessary create other exception and inherit. The others exceptions only throw an exception
Custom exception example
public class InvalidStateException : DomainException
{
public InvalidStateException()
{ }
public InvalidStateException(string message) : base(message)
{ }
public InvalidStateException(string message, Exception innerException) : base(message, innerException)
{ }
}
Throw exceptions
throw new InvalidStateException("Custom domain exception message");
throw new UnauthorizedException("Custom unauthorized exception message");
throw new CannotAccessException("Custom cannot access exception message");
throw new NotFoundException("Custom not found exception message");
throw new Exception("Custom exception message");
Customize exception type
It's possible to customize the exception type when throw an exception, just pass the type in an exception constructor.
throw new CustomDomainException("Custom domain exception message", "OTHER_CUSTOM_TYPE");
Samples
Inside the samples
folder has two projects that could be used for test the and validate the middleware.
Run the sample projects
- WebAppTest
dotnet run --project .\samples\CustomExceptionMiddleware.WebAppTest\
- WebAppTest.Custom
dotnet run --project .\samples\CustomExceptionMiddleware.WebAppTest.Custom\
Samples documentation
- Swagger
- Postman
- Open
docs
folder, inside has a postman collection that could be used for test.
- Open
Logging
This middleware will Log
some informations that can be used for monitoring and observability, like TraceIdentifier
, request and exception informations like message type and stack trace:
Example log:
Occurred an exception - TraceId: 0HMBO9LGH0JHD:00000002 - ExceptionType: InvalidStateException - Message: Custom domain exception message
CustomExceptionMiddleware.WebAppTest.InvalidStateException: Custom domain exception message
at CustomExceptionMiddleware.WebAppTest.Custom.ProductService.GetDomainException(Boolean returnProducts) in C:\\isaacnborges\\projects\\custom-exception-middleware\\tests\\CustomExceptionMiddleware.WebAppTest.Custom\\ProductService.cs:line 18\r\n at CustomExceptionMiddleware.WebAppTest.Custom.Controllers.ProductController.GetDomain(Boolean returnProduct) in C:\\isaacnborges\\projects\\custom-exception-middleware\\tests\\CustomExceptionMiddleware.WebAppTest.Custom\\Controllers\\ProductController.cs:line 26
Using custom attribute
In some scenarios the project needs other response object, integrations with 3rd party systems for example, this middleware contains an attribute that could be ignore, it's possible use in class or methods
Using the IgnoreCustomExceptionAttribute
attribute the middleware will ignore your own flow. To use it simply, decorate the class or method with the name.
Class example
[IgnoreCustomException] public class ValuesController : ControllerBase { [HttpGet] public IActionResult Get() { throw new CustomDomainException("Some error ignore class"); }
Method example
[IgnoreCustomException] [HttpGet("ignore")] public IActionResult GetIgnore() { throw new CustomDomainException("Some error ignore method"); }
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
License
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.AspNetCore.Mvc.Abstractions (>= 2.2.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Options (>= 8.0.0)
- System.Text.Json (>= 8.0.0)
-
.NETStandard 2.1
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.AspNetCore.Mvc.Abstractions (>= 2.2.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Options (>= 8.0.0)
- System.Text.Json (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.