我如何捕获(自定义异常处理程序)我在自定义关闭函数中抛出的异常(自定义异常处理程序)?我没有使用任何框架。
示例:
register_shutdown_function( 'shutdownFunction');
set_exception_handler( 'exceptionHandler');
function exceptionHandler(Exception $exception)
{
// handle and log exception for later debugging...
}
function shutdownFunction()
{
// something is not going right...
if (someVariable != someValue)
throw new RuntimeException('blah...'); // WILL NOT be caught by exception handler
}
// somewhere else in the code...
throw new Exception('something...'); // WILL be caught by exception handler (but not in shutdown function)
脚本正在使用异常来表示它在执行期间遇到错误,即。意外变量传递给函数,数据库无法插入行等...
答案 0 :(得分:0)
您根本无法在php中做到这一点。
register_shutdown_function
回调是PHP应用程序中发生的最后一件事。尝试在其中引发异常只会调用标准的php处理程序。关于这些内部工作原理,在网络上找不到很多东西。
但是,我创建了自己的解决方案以将其定向到单个功能。
set_exception_handler
和register_shutdown_function
是非常不同的功能:
set_exception_handler
收到一个参数Exception
register_shutdown_function
默认不接收参数我已经做到了,set_exception_handler
(接收$exception
作为参数)设置了一个可以在register_shutdown_function
中使用的属性。
$lastException = null;
set_exception_handler(function ($e) use (&$lastException) {
$lastException = $e;
});
register_shutdown_function(function() use(&$lastException) {
if($error = error_get_last()) {
$lastException = new \ErrorException($error['message'], $error['type'], 1, $error['file'], $error['line']);
}
if($lastException) {
if (APPLICATION_ENV === 'production') {
Sentry\captureException($lastException);
} else {
var_dump($lastException);
}
}
});
我不知道这是否是解决问题的好方法,但是它使我能够在同一函数中捕获require unexisting_phpfile1389.php
错误(致命)和常规throw \Exception()
。
尝试在关闭处理程序中引发异常将导致以下异常(具有讽刺意味的是):
(!)致命错误:未捕获错误:只能将对象扔进去 C:... \ index.php在第34行
(!)错误:只能将对象扔进去 C:... \ index.php在第34行
答案 1 :(得分:-1)
您可以使用
包装shutdownFunction的主体function shutdownFunction()
try {
...
} catch (\Exception $e) {
// do something
}
}
并且您将捕获所有异常因为异常是所有异常的基类