PHP中的例外 - Try/Catch或set_exception_handler?

Syn*_*tax 17 php exception

我正在我的系统中开发一些使用php异常类的多个子类的低端代码.基本上我有几个类别的例外.我想要做的是两件事.

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

我想知道的是我应该使用某种try/catch封装应用程序吗?我根本不喜欢这个想法,这听起来像是一个非常糟糕的实现.我也不喜欢set_exception_handler的想法,除非我可以将函数设置为对象的方法.原因是如果我指定一个函数来处理异常,那么这将是应用程序中的第一个函数.其他一切都是对象的方法.

希望我已经提供了有关该方案的足够详细信息.我正在努力保持这种清洁并遵循最佳做法.这段代码将用于OSS所以我不想写它10次:)

Cre*_*esh 23

  1. 通过Front Controller脚本运行Web请求
  2. set_exception_handler尽早致电(别忘了考虑error_reporting()).set_exception_handler作为它的参数,php称之为"回调".你可以像这样传递一个对象方法:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 包装您的调度代码try/catch以捕获任何会抛出异常的代码.您的代码的catch部分将捕获所有您自己的代码的异常,以及一些本地未生成异常的php错误(例如fopen或某些东西),这要归功于您的set_exception_handler上述调用.php手册说明:

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

  4. 根据需要记录错误.

  5. 在开发中创建一个错误页面模板("视图"),该模板对Exception对象("模型")进行操作,并为您打印整个堆栈跟踪.创建一个转到生产的不同模板.在您的环境中分支,例如:

    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";
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Jam*_*col 11

有一个关于PHP的"回调"更具体的信息在这里.要使用静态方法,回调就像

<?php
set_exception_handler(array('MyClass','staticMethod'));
?>
Run Code Online (Sandbox Code Playgroud)

要使用实例化对象中的方法,它是:

<?php
set_exception_handler(array($myObject, 'objectMethod'));
?>
Run Code Online (Sandbox Code Playgroud)

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

<?php
set_exception_handler('my_global_function');
?>
Run Code Online (Sandbox Code Playgroud)