【问题标题】:Handle / Log Exceptions that are caught in the whole application处理/记录在整个应用程序中捕获的异常
【发布时间】:2020-03-10 16:37:04
【问题描述】:

我目前正在维护一个包含大量代码库的应用程序。该应用程序仍在开发中。

我的目标是记录应用程序中抛出的所有异常。还有那些在 try catch 块中被捕获的。由于代码库很大,我无法在 catch 块中添加单行代码或创建我的自定义异常类。

我尝试解决或寻找解决方案的方式是:

  • 在整个应用程序中监听类构造
  • 重写 Exception 类(不能这样做,因为它是一个核心 php 类)

我最近尝试的代码是: 我的测试异常 (dashboardcontroller.php)

try {
        throw new \Exception('custom thrown exception');
    } catch (\Exception $e) {
        Log::info('Exception caught');
    }

Exceptions\Handler.php

public function report(Exception $exception)
    {
        Log::info($exception);
        parent::report($exception);
    }

Log

[2020-03-10 17:19:09] local.INFO: Exception caught

所以问题是:如何在不添加需要大量更改的代码的情况下记录/处理 try catch 块中捕获的抛出异常?

【问题讨论】:

    标签: php laravel exception


    【解决方案1】:

    简答:你不能(据我所知)

    捕获的异常通常是出于某种原因;它们在 catch 语句(即异常处理程序)中处理(或:它们应该)。这是您要记录的未捕获异常。

    异常不应该用于程序流,但它确实会发生,有时是有充分理由的:

    if (fileExists('foo.txt')) {
      fileDelete('foo.txt'); // May result in a race-condition
    }
    

    V.s.:

    try {
      fileDelete('foo.txt')
    catch (IOException) {
      // NO-OP
    }
    

    另一种常见模式:

    while (true) {
      try {
        item = queue.Receive(10); // Wait max. 10 seconds
        process(item);            // Process item
      } catch (TimeOutException) {
        // Nothing on queue, handle other stuff and then continue waiting...
        DoStuff();
      }
    }
    

    以上模式很常见。再说一遍:程序流不应该使用异常,上面的队列示例肯定不应该存在,但事实是它确实发生了。现实世界的应用程序、库、API 等有时只是这样工作,一旦您处理 第 3 方应用程序、库或 API,您就会遇到麻烦,因为您不能总是改变一切到你喜欢的样子。

    您能想象上述队列示例中的日志文件与 24/7 运行的应用程序的“通用应用程序范围捕获记录器”吗?

    何时记录异常(也许同样重要:记录什么根据具体情况考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-13
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多