【问题标题】:Exceptions in PHP - Try/Catch or set_exception_handler?PHP 中的异常 - Try/Catch 或 set_exception_handler?
【发布时间】:2010-10-08 02:36:13
【问题描述】:

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

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

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

希望我已经提供了有关该场景的足够详细信息。我正在努力保持清洁并遵循最佳实践。这段代码会变成 OSS,所以我不想写 10 次 :)

【问题讨论】:

标签: php exception


【解决方案1】:
  1. 通过Front Controller script 运行您的网络请求
  2. 在执行早期调用set_exception_handler(不要忘记考虑error_reporting())。 set_exception_handler 将 php 称为 "callback" 的内容作为其参数。你可以像这样传递一个对象方法:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  3. 使用try/catch 包装您的调度代码,以捕获任何确实引发异常的代码。由于您的set_exception_handler 调用,您的代码的catch 部分将捕获您自己的代码的所有异常,以及一些 本身未生成异常的php 错误(例如fopen 或其他东西)更多。 php手册指出:

    以下错误类型不能 使用用户定义的函数处理: E_ERROR、E_PARSE、E_CORE_ERROR、 E_CORE_WARNING,E_COMPILE_ERROR, E_COMPILE_WARNING 和大多数 E_STRICT 在文件中提出 调用 set_error_handler()。

  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 的“回调”here 的具体信息。要使用静态方法,回调类似于

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

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

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

要使用全局函数,只需:

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

【讨论】:

    【解决方案3】:

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

    至于设置 set_exception_handler,我不确定是否可以将函数设置为对象的方法,除非它是静态方法。看来情况确实如此。有更多信息http://us2.php.net/set_exception_handler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-20
      • 2011-09-16
      • 2011-01-11
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多