全局错误捕手

pit*_*dis 6 asp.net-core asp.net-core-2.0 razor-pages

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

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

app.UseExceptionHandler("/Error");
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*alC 5

您可以创建自己的异常过滤器,它实现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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的ConfigureServices方法中添加这个过滤器,如下所示:

services.AddMvc(o => { o.Filters.Add<GlobalExceptionFilter>(); });
Run Code Online (Sandbox Code Playgroud)

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

app.UseStatusCodePagesWithReExecute("/error/{0}");
Run Code Online (Sandbox Code Playgroud)

然后,您可以在您的ErrorController.

有关详细信息,请参阅ASP.NET Core 中的错误处理简介

  • 由于 OP 非常不具体,应该注意的是,这只会捕获在 **请求** 期间发生的结果。它不会捕获请求之外的异常,即由在后台运行的进程(如 Hangfire 等计划)引起的(不是,在 ASP.NET Core 中运行后台任务是一个好主意;)) (2认同)