我正在处理异常日志记录脚本,我使用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");
答案 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变量