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

时间:2009-02-17 14:27:55

标签: php exception

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

  1. 我需要在应用程序中触发的所有异常都在一个地方处理。
  2. 我需要能够记录然后处理/生成视图以便用户接收有关应用程序的反馈。错误。
  3. 我想知道的是我应该使用某种try / catch封装应用程序吗?我根本不喜欢这个想法,这听起来像是一个非常糟糕的实现。我也不喜欢set_exception_handler的想法,除非我可以将函数设置为对象的方法。原因是如果我指定一个函数来处理异常,这将是应用程序中的第一个函数。其他一切都是对象的方法。

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

3 个答案:

答案 0 :(得分:23)

  1. 通过Front Controller script
  2. 运行您的网络请求
  3. 在执行初期致电set_exception_handler(不要忘记考虑error_reporting())。 set_exception_handler将php称为"callback"的参数作为其参数。你可以像这样传递一个对象方法:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  4. 使用try/catch包裹您的调度代码以捕获任何会抛出异常的代码。代码的catch部分将捕获所有代码的异常,以及一些 php错误,这些错误本身不会产生异常(例如fopen或其他),感谢您的{{ 1}}以上呼叫。 php手册说明:

      

    以下错误类型不能   使用用户定义的函数处理:   E_ERROR,E_PARSE,E_CORE_ERROR,   E_CORE_WARNING,E_COMPILE_ERROR,   E_COMPILE_WARNING,以及大部分内容   E_STRICT在文件中引发了   调用set_error_handler()。

  5. 根据需要记录错误。

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

    set_exception_handler

答案 1 :(得分:11)

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

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

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

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

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

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

答案 2 :(得分:4)

从听起来的方式来看,你将使用set_exception_handler。这将保证以完全相同的方式处理所有异常。在您的应用程序中有一些地方可以使用try / catch块,例如,如果您想检查一个不一定需要以相同方式捕获的异常。

就设置set_exception_handler而言,我不确定你是否可以将该函数设置为对象的方法,除非它是静态方法。看来情况就是这样。 http://us2.php.net/set_exception_handler

有更多信息