全局错误捕手

时间:2018-02-02 07:50:18

标签: asp.net-core asp.net-core-2.0 razor-pages

在我的项目中,我想记录数据库表中应用程序中发生的所有错误。我使用try catch块捕获几乎所有错误,但我无法捕获像4xx和5xx这样的全局错误。

在某些情况下,应用程序不会重定向到Startup.cs的Configure方法中定义的异常处理程序,就像我键入不存在的URL一样。

app.UseExceptionHandler("/Error");

有没有办法捕获我的应用程序中发生的所有未处理的错误?

1 个答案:

答案 0 :(得分:3)

您可以创建自己的异常过滤器,它实现IExceptionFilter例如:

public class GlobalExceptionFilter : IExceptionFilter
{
    ILogger<GlobalExceptionFilter> logger = null;

    public GlobalExceptionFilter(ILogger<GlobalExceptionFilter> exceptionLogger)
    {
        logger = exceptionLogger;
    }

    public void OnException(ExceptionContext context)
    {
        // log the exception
        logger.LogError(0, context.Exception.GetBaseException(), "Exception occurred.");
    }
}

然后,您可以在ConfigureServices方法中添加此过滤器,如下所示:

services.AddMvc(o => { o.Filters.Add<GlobalExceptionFilter>(); });

这将捕获由于请求而发生的任何未公开的异常。对于404s,您可以将以下内容添加到Configure方法中:

app.UseStatusCodePagesWithReExecute("/error/{0}");

然后,您可以在ErrorController

中记录状态代码

有关详细信息,请参阅Introduction to Error Handling in ASP.NET Core