【问题标题】:Global Error Catcher全局错误捕捉器
【发布时间】:2018-07-12 16:22:19
【问题描述】:

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

在某些情况下,应用程序不会重定向到 Startup.cs 的 Configure 方法中定义的异常处理程序,例如当我键入一个不存在的 url 时。

app.UseExceptionHandler("/Error");

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

【问题讨论】:

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


    【解决方案1】:

    您可以创建自己的异常过滤器,实现 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>(); });
    

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

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

    然后您可以在ErrorController 中记录状态代码。

    更多信息请见Introduction to Error Handling in ASP.NET Core

    【讨论】:

    • 它有效。非常感谢。我只有一个问题。在我的路由中,我包含了当前语言,但我不知道如何将它包含在 app.UseStatusCodePagesWithRedirects("/en-US/error/{0}"); 中。现在我使用“en-US”,但我想使用 lang 路由值,以便系统使用当前语言。
    • 我快速浏览了一下,但我也不确定如何处理。抱歉,可能需要创建另一个问题。
    • 没关系。我将针对这个问题提出一个新问题。
    • 由于 OP 非常不具体,应该注意的是,这只会捕获 request 期间发生的结果。它不会捕获请求之外的异常,即由在后台运行的进程引起的(例如 Hangfire 等计划)(不是,在 ASP.NET Core 中运行后台任务是一个好主意;))
    猜你喜欢
    • 2011-07-12
    • 2010-12-05
    • 2013-10-12
    • 1970-01-01
    • 2020-04-02
    • 2017-03-07
    • 2014-03-25
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多