我有一个网关脚本,它将JSON返回给客户端。在脚本中,我使用set_error_handler捕获错误,并且仍然具有格式化的返回值。
它受到“允许的内存大小用尽”错误的约束,但是与其使用ini_set(’memory_limit’,‘19T’)之类的方法来增加内存限制,我只是想返回用户应该尝试其他方法的原因,因为它过去经常记忆。
有什么好的方法可以捕获致命错误?
就像这个答案所暗示的那样,您可以register_shutdown_function()用来注册将检查的回调error_get_last()。
register_shutdown_function()
error_get_last()
无论是@( 闭嘴 )运算符,还是ini_set('display_errors', false)
@
ini_set('display_errors', false)
ini_set('display_errors', false); error_reporting(-1); set_error_handler(function($code, $string, $file, $line){ throw new ErrorException($string, null, $code, $file, $line); }); register_shutdown_function(function(){ $error = error_get_last(); if(null !== $error) { echo 'Caught at shutdown'; } }); try { while(true) { $data .= str_repeat('#', PHP_INT_MAX); } } catch(\Exception $exception) { echo 'Caught in try/catch'; }
运行时,输出Caught atshutdown。不幸的是,ErrorException没有抛出异常对象,因为致命错误触发了脚本终止,随后仅在关闭函数中被捕获。
Caught atshutdown
ErrorException
您可以$error在关闭功能中检查阵列以获取有关原因的详细信息,然后做出相应的响应。一个建议可能是针对您的Web应用程序重新发出请求( 在不同的地址或使用不同的参数 ),然后返回捕获的响应。
$error
我建议保持error_reporting()较高 的值-1( 值为 ),并使用( 如其他人所建议的 )对set_error_handler()和进行其他所有操作ErrorException。
error_reporting()
-1
set_error_handler()