我想从回调函数中获取错误对象。这是我到目前为止所做的。
$errors = null;
set_exception_handler(function($exception) use (&$errors) {
$errors = $exception;
var_dump($exception); // works fine
});
var_dump($errors); // give null ????
throw new Exception("blablblablablabla", 0);
我确信使用匿名函数,变量可以正常工作! 但在这种情况下使用回调和对象我不知道发生了什么?我无法理解我的头脑。任何帮助解释都会非常感激。
答案 0 :(得分:2)
set_exception_handler
不会停止执行。它只定义了异常发生时会发生什么,因此设置后可能会出现var_dump($errors);
错误。 $errors
此时仍然为null,因为您已将其设置为null,并且尚未发生任何更改。
停止执行的事情是当实际发生异常并且调用set_exception_handler
中定义的匿名函数时。此时,调用该函数中的var_dump($exception);
,但不会执行发生异常的点之后主程序中的任何其他代码。
在异常处理程序中将异常存储在全局变量中并没有真正意义,因为如果调用异常处理程序,主程序中将不再执行任何代码,因此您将无法使用那个变量无论如何。
答案 1 :(得分:1)
您将匿名函数指定为set_exception_handler()
的异常处理程序。
但是你不会在你的代码中抛出异常。因此,永远不会调用匿名函数,因为没有要处理的事件,这意味着从未设置$error
。
如果添加try catch
块,也不会调用您的函数。这可以通过以下事实看出:处理程序中的行var_dump($exception)
也未被调用。
如果要在代码中存储最后一个被调用的异常,则可能需要使用围绕该代码的包装函数,该函数使用try catch
覆盖遇到上一个异常的静态资源。
请注意,给定函数中的异常永远不会被完全抛出,因为它被包装器捕获了!
class Catcher {
private static $_EXCEPTION = null;
public static function GET_EXCEPTION () {
return self::$_EXCEPTION;
}
public static function run($func) {
try {
return $func();
} catch (Exception $e) {
self::$_EXCEPTION = $e;
}
}
}
var_dump(Catcher::GET_EXCEPTION()); //dumps NULL
Catcher::run(function(){
throw new Exception('I was called');
});
var_dump(Catcher::GET_EXCEPTION()); //dumps the last thrown exception