0%

[DotnetCore]GlobalErrorHandler

前情提要

筆者這篇就講一點輕鬆的話題,筆者慣用的設計,就是不喜歡在到處放try catch,希望在一個地方統一try catch就好,這樣若要改變Exception處理行為,就改一個地方即可,當然有時你為了要配合某種情境,碰到Exception,要將某一些處理狀態要壓成F等等,無論如何,筆者都會先設計一個GlobalErrorHandler做統一抓取Exception並處理。

內容

dotnet core的設計架構,有很多種形式撰寫並達到Global Error Handler的效果,筆者選擇最直覺的方式:Global Error Handling Middleware

撰寫GlobalErrorHandlingMiddleware

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class GlobalErrorHandlingMiddleware
{
private readonly RequestDelegate _next;

public GlobalErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
// Step1: 處理Exception(記Log或其他)
// Step2: 回傳統一結構Result
}
}
}

就這麼簡單,把_next.Invoke(context)try catch包起來即可。

註冊GlobalErrorHandlingMiddleware

1
2
3
4
5
6
7
8
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<GlobalErrorHandlingMiddlware>();
// Other Middleware...
}
}

結論

Global Error Handler是滿重要的,透過簡單的Middlware機制,可以抓取各式各樣的Exception,也可以在該地方辨別不同的Exception類型,並針對每一種類型處理不一樣的效果。

參考

https://blog.johnwu.cc/article/ironman-day17-asp-net-core-exception-handler.html