在请求中捕获异常,无需逐个指定

本文关键字:请求 捕获异常 | 更新日期: 2023-09-27 18:34:51

应用程序体系结构:

  • MVC .NET C# 应用程序
  • 有两个层:数据库层通信(捕获和处理错误(和处理 Web 请求/响应的应用程序层。
  • 数据库层
  • 不会告诉应用层一些发生的重要错误(例如:超时请求数据库,数据库未找到/关闭...

我想要的是应用程序层,捕获超时请求数据库并逐个处理它们,而不是以相同的方式处理它们(就像现在正在发生的那样(。

我无权访问数据库层代码

问题:

  • 可能吗?
  • 如果可能的话,它像我想要的那样是正确的程序?

谢谢。

在请求中捕获异常,无需逐个指定

为了补充@Matías答案,还可以从应用程序域获得有关首次机会异常的通知。这意味着你可以有一个处理程序来处理代码中抛出的所有异常,即使它们被捕获:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
AppDomain.CurrentDomain.FirstChanceException += FirstChanceExceptionHandler;

例如,如果你写这样的东西:

static void Main(string[] args)
{
    // attach mentioned handlers
    AppDomain.CurrentDomain.UnhandledException += 
        (sender, e) => Dump("Unhandled exception", e.ExceptionObject);
    AppDomain.CurrentDomain.FirstChanceException += 
        (sender, e) => Dump("First chance exception intercepted", e.Exception);
    // this will get intercepted by the FirstChanceException handler
    try
    {
        throw new InvalidOperationException("Thrown inside try/catch");
    }
    catch (Exception ex)
    {
        Console.WriteLine("This was caught: " + ex.Message);
    }
    // this will get intercepted by the FirstChanceException handler
    // and then caught by UnhandledException handler
    throw new InvalidOperationException("Thrown OUTSIDE try/catch");
}
private static void Dump(string info, object exception)
{
    var ex = (Exception)exception;
    Console.WriteLine(info + ": " + ex.Message);
}

您将获得以下输出:

第一次机会异常被拦截:扔进尝试/接球这是由捕获子句捕获的: : 扔进 try/catch第一次机会异常被拦截:抛出外部尝试/接球未处理的异常:抛出外部尝试/捕获

显然,您可能会遇到一大堆第一次机会异常,因此请为该处理程序方法中的一些过滤逻辑做好准备。

如果两个位于同一物理中,则可以在应用程序层中使用AppDomain.UnhandledException事件。

如果可能的话,它像我想要的那样是正确的程序?

虽然这个问题非常主观,但使用捕获所有代码来处理未经处理的异常并执行诸如记录消息或向 UI 显示错误以通知用户出现问题等操作的情况并不少见。

例如,ASP.NET WebAPI 同时具有异常筛选器异常处理程序。旧 ASP.NET 应用具有Global.asax Application_Error事件,许多其他框架具有其全局异常处理点。