PHP异常处理程序和关闭函数

时间:2014-08-21 20:58:12

标签: php exception-handling

我如何捕获(自定义异常处理程序)我在自定义关闭函数中抛出的异常(自定义异常处理程序)?我没有使用任何框架。

示例:

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)

脚本正在使用异常来表示它在执行期间遇到错误,即。意外变量传递给函数,数据库无法插入行等...

2 个答案:

答案 0 :(得分:0)

您根本无法在php中做到这一点。

register_shutdown_function回调是PHP应用程序中发生的最后一件事。尝试在其中引发异常只会调用标准的php处理程序。关于这些内部工作原理,在网络上找不到很多东西。

但是,我创建了自己的解决方案以将其定向到单个功能。

set_exception_handlerregister_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
    }
}

并且您将捕获所有异常因为异常是所有异常的基类