PHP 中的异常 - 尝试/捕获或set_exception_handler?

2022-08-30 21:57:03

我正在我的系统中开发一些低端代码,这些代码使用php异常类的多个子类。本质上,我将异常分解为几个类别。我想做的是两件事。

  1. 我需要在一个位置处理应用程序中触发的所有异常。
  2. 我需要能够记录,然后处理/生成视图,以便用户接收有关应用程序的反馈。

我想知道的是,我是否应该进行某种尝试/捕获来封装应用程序?我一点也不喜欢这个想法,这听起来像是一个非常蹩脚的实现。我也不喜欢set_exception_handler的想法,除非我可以将函数设置为对象的方法。这样做的原因是,如果我指定一个函数来处理异常,这将是应用程序中的第一个函数。其他一切都是对象的方法。

希望我已经提供了有关该方案的足够详细信息。我试图保持清洁并遵循最佳实践。这段代码将用于OSS,所以我不想把它写10次:)


答案 1
  1. 通过前端控制器脚本运行 Web 请求
  2. 调用set_exception_handler执行的早期(不要忘记考虑)。 将php所谓的“回调”作为其参数。您可以像这样传递对象方法:error_reporting()set_exception_handler

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  3. 包装调度代码,以捕获任何会引发异常的代码。代码的 catch 部分将捕获你自己的代码的所有异常,再加上一些 php 错误,这些错误本身没有生成异常(例如或其他东西),这要归功于你上面的调用。php 手册指出:try/catchfopenset_exception_handler

    用户定义的函数无法处理以下错误类型:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING以及调用 set_error_handler() 的文件中引发的大多数E_STRICT。

  4. 根据需要记录错误。

  5. 创建一个错误页面模板(“视图”),该模板在异常对象(“模型”)上运行,并在开发过程中为您打印整个堆栈跟踪。创建进入生产环境的其他模板。在您的环境中分支,例如:

    catch(Exception $e) {
        // log error as necessary here.
        if("in developement") {
            // $e would be available to your template at this point
            include "errortemplates/dev.php";
        } else {
            include "errortemplates/prod.php";
        }
    }
    

答案 2

这里有更多关于PHP“回调”的具体信息。要使用静态方法,回调类似于

<?php
set_exception_handler(array('MyClass','staticMethod'));
?>

要使用实例化对象中的方法,请执行以下操作:

<?php
set_exception_handler(array($myObject, 'objectMethod'));
?>

要使用全局函数,它只是:

<?php
set_exception_handler('my_global_function');
?>

推荐