首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用PHP中的全局异常处理程序以统一的方式处理各种顶层异常

尝试使用PHP中的全局异常处理程序以统一的方式处理各种顶层异常
EN

Stack Overflow用户
提问于 2011-05-12 23:08:24
回答 1查看 6.1K关注 0票数 2

请考虑以下代码:

代码语言:javascript
复制
<?php

class MyException extends Exception {}

function global_exception_handler($exception)
{
    switch (get_class($exception)) {
    case 'MyException':
        print "I am being handled in a unified way.\n";
        break;
    default:
        $backtrace = debug_backtrace();
        $exception_trace_object = $backtrace[0]['args'][0];
        var_dump($exception_trace_object);
        print "----\n";
        $reflected_exception_trace_object = new ReflectionObject($exception_trace_object);
        $reflected_trace_property = $reflected_exception_trace_object->getProperty('trace');
        $reflected_trace_property->setAccessible(true);
        var_dump($reflected_trace_property);
        print "----\n";

        // NOT WORKING, I STUCK HERE.
        var_dump($reflected_trace_property->getValue($reflected_trace_property));

        throw $exception;
    }
}

set_exception_handler('global_exception_handler');

function function1()
{
    function2();
}

function function2()
{
    function3();
}

function function3()
{
    throw new Exception();
}

function1();

?>

我试图做的是通过简单地设置一个全局异常处理程序,而不需要编写任何样板代码(除了每个文件中包含的页眉和页脚),以统一的方式处理各种文件中的各种类型的异常。

问题是,当抛出的异常类型没有由全局异常处理程序处理时,我想重新抛出异常,堆栈跟踪就会丢失,这是使用set_exception_handler()的一个限制。

我可以使用debug_backtrace()检索堆栈跟踪,但是我不能访问它的相关私有成员来适当地打印它。

这就是上面的脚本产生的结果:

代码语言:javascript
复制
object(Exception)#1 (7) {
  ["message":protected]=>
  string(0) ""
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(28) "/home/laci/download/test.php"
  ["line":protected]=>
  int(42)
  ["trace":"Exception":private]=>
  array(3) {
    [0]=>
    array(4) {
      ["file"]=>
      string(28) "/home/laci/download/test.php"
      ["line"]=>
      int(37)
      ["function"]=>
      string(9) "function3"
      ["args"]=>
      array(0) {
      }
    }
    [1]=>
    array(4) {
      ["file"]=>
      string(28) "/home/laci/download/test.php"
      ["line"]=>
      int(32)
      ["function"]=>
      string(9) "function2"
      ["args"]=>
      array(0) {
      }
    }
    [2]=>
    array(4) {
      ["file"]=>
      string(28) "/home/laci/download/test.php"
      ["line"]=>
      int(45)
      ["function"]=>
      string(9) "function1"
      ["args"]=>
      array(0) {
      }
    }
  }
  ["previous":"Exception":private]=>
  NULL
}
----
object(ReflectionProperty)#3 (2) {
  ["name"]=>
  string(5) "trace"
  ["class"]=>
  string(9) "Exception"
}
----
NULL

Fatal error: Exception thrown without a stack frame in Unknown on line 0

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-12 23:24:57

查看http://php.net/manual/de/function.set-exception-handler.php上的评论,那里有几个类似的问题和解决方案。对于您的代码,我看到了两种可能的解决方案:

将您的代码更改为

代码语言:javascript
复制
function global_exception_handler($exception = NULL)

或将描述添加到

代码语言:javascript
复制
throw new Exception('Testing here...');
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5980161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档