PHP:如何在exception_handler中获取所有已定义的变量

时间:2014-05-22 08:35:47

标签: php exception

我正在处理异常日志记录脚本,我使用set_exception_handler()来处理未捕获的异常。

在我的自定义异常处理程序中,我使用get_defined_vars()但它只返回一个带有异常对象的数组,在抛出异常之前创建的每个变量都消失了

$testing_var = 'testtesttest';

try {
throw new Exception("Error Processing Request");
} catch (Exception $e) {
var_dump(get_defined_vars()); // this could get $testing_var 
}

set_exception_handler('exception_handler');

function exception_handler(exception)
{
 var_dump(get_defined_vars()); // no, it can't get $testing_var, exception object only
}

throw new Exception("Error Processing Request");

2 个答案:

答案 0 :(得分:0)

在您调用get_defined_vars()的范围内,您所使用的变量未定义,因此当然不会返回。 from the docs

  

此函数返回一个多维数组,其中包含所有已定义变量的列表,包括环境,服务器或用户定义的变量,在调用get_defined_vars()的范围内

你想要达到什么目的?通常,在构造异常时,应将异常处理异常所需的所有信息传递给异常。可能使用自定义异常类:

<?php

// custom exception class
// could be extended with constructor accepting an optional context
class ContextAwareException extends Exception
{
    private $context;

    public function setContext($context)
    {
        $this->context = $context;
    }

    public function getContext()
    {
        return $this->context;
    }
}

function exception_handler($exception)
{
    if ($exception instanceof ContextAwareException) {
        $exception->getContext();
    } else {
        // we have no context
    }
}

/*
 * using this exception
 */

$testing_var = 'testtesttest';

$exception = new ContextAwareException("Error Processing Request");
$exception->setContext(get_defined_vars());
throw $exception;

答案 1 :(得分:0)

我找到了另一种方法。我也在寻找异常解决方案,但这个对我有用。如果您使用错误而不是例外 - 它似乎有效。

set_error_handler('test','handler');

class test {

    public static function handler($code, $error, $file = NULL, $line = NULL) {

        throw new Exception($error, $code, 0, $file, $line);

        return true;
    }
}

$testVar='carolines';

try { 
    trigger_error('megamsg');
}

catch(Exception $e) {

    var_dump($e);

    $vars=$E BLABLABLA

}

了解如何从$ e中提取。但是如果你调试你将在跟踪处理程序函数调用中看到$ testVar变量