這個是網上搜到的,覺的說的聽清楚的,轉發下,原文地址 https://www.jb51.net/article/121970.htm
簡介
異常過濾器,顧名思義,就是當程序發生異常時所使用的過濾器。用於在系統出現未捕獲異常時的處理。
實現一個自定義異常過濾器
自定義一個全局異常過濾器需要實現IExceptionFilter接口
|
1
2
3
4
5
6
7
|
public
class
HttpGlobalExceptionFilter : IExceptionFilter
{
public
void
OnException(ExceptionContext context)
{
throw
new
NotImplementedException();
}
}
|
IExceptionFilter接口會要求實現OnException方法,當系統發生未捕獲異常時就會觸發這個方法。OnException方法有一個ExceptionContext異常上下文,其中包含了具體的異常信息,HttpContext及mvc路由信息。系統一旦出現未捕獲異常后,比較常見的做法就是使用日志工具,將異常的詳細信息記錄下來,方便修正調試。下面是日志記錄的實現。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/// <summary>
/// 全局異常過濾器
/// </summary>
public
class
HttpGlobalExceptionFilter : IExceptionFilter
{
readonly
ILoggerFactory _loggerFactory;
readonly
IHostingEnvironment _env;
public
HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env)
{
_loggerFactory = loggerFactory;
_env = env;
}
public
void
OnException(ExceptionContext context)
{
var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType);
logger.LogError(
new
EventId(context.Exception.HResult),
context.Exception,
context.Exception.Message);
var json =
new
ErrorResponse(
"未知錯誤,請重試"
);
if
(_env.IsDevelopment()) json.DeveloperMessage = context.Exception;
context.Result =
new
ApplicationErrorResult(json);
context.HttpContext.Response.StatusCode = (
int
)HttpStatusCode.InternalServerError;
context.ExceptionHandled =
true
;
}
public
class
ApplicationErrorResult : ObjectResult
{
public
ApplicationErrorResult(
object
value) :
base
(value)
{
StatusCode = (
int
)HttpStatusCode.InternalServerError;
}
}
public
class
ErrorResponse
{
public
ErrorResponse(
string
msg)
{
Message = msg;
}
public
string
Message {
get
;
set
; }
public
object
DeveloperMessage {
get
;
set
; }
}
|
注冊全局過濾器
過濾器已經編寫完畢,接下來就需要在asp.net core MVC中注冊。找到系統根目錄Startup.cs文件,修改ConfigureServices方法如下
|
1
2
3
4
|
services.AddMvc(options =>
{
options.Filters.Add<HttpGlobalExceptionFilter>();
});
|
測試
在請求中拋出一個異常

日志正確捕獲到異常信息
瀏覽器返回500錯誤,並且返回自定義的錯誤信息。


