gpt4 book ai didi

php - ExceptionHandler 没有捕获所有未捕获的异常

转载 作者:搜寻专家 更新时间:2023-10-31 21:42:37 25 4
gpt4 key购买 nike

我构建了一个简单的 ExceptionHandler 类:

class ExceptionHandler{

public function __construct(){

set_exception_handler(array($this, 'handleException'));
}

public function handleException(\Exception $exception){
echo $exception->getMessage() . $exception->getLine() . $exception->getFile());

}
}

ExceptionHandler 对象在处理过程中尽早创建。在 ExceptionHandler 之后不久构造一个使用数据库存储其数据的 session 组件。

session 组件设置以下内容以在使用 APC 时正确关闭 session :

register_shutdown_function('session_write_close'); 

然后我通过关闭 MySQL 服务器并运行应用程序来执行测试。令人费解的是,异常被ExceptionHandler捕获,但同时仍未被捕获,由xdebug输出:

SQLSTATE[HY000] [2002] ????,??????????? at line 133 in RedBean_Driver_PDO.php. //This is generated by my exception handler

//These were uncaught and processed by Xdebug
Fatal error: Uncaught exception 'Exception' with message 'PDO::__construct() [133

( ! ) Exception: PDO::__construct() [pdo.--construct]: [2002] ????,??????????? (trying to connect via tcp://localhost:3306) in RedBean_Driver_PDO.php on line 133

Call Stack
//Call stack

这可能是什么原因造成的?我的理解是 ExceptionHandler 应该能够捕获所有未捕获的异常,除了在 ExceptionHandler 中抛出的任何异常。

更新:我有一种感觉,这必须处理关闭时调用的 session_write_close。 session_write_close 需要访问数据库,但数据库不可用。然后抛出异常。由于脚本执行已经结束,ExceptionHandler 不可用,所以我们得到一个未捕获的异常。反正有这方面的吗?

我在 apache 2.2 上使用 mod_cgi 在 Windows 7 机器上将 php 5.3.9 作为 fcgi 运行。

堆栈跟踪:

#   Time    Memory  Function
1 2.0323 767336 ExceptionHandler->handleException( ) //Initial exception caught + handled
2 2.0334 773968 Session->write( ) //Script shutdown started (session_write_close to database)
3 2.0335 774344 Database->findOne( )
4 2.0335 774640 Database->__call( )
5 2.0335 774728 call_user_func_array( )
6 2.0335 775016 RedBean_Facade::findOne( )
7 2.0335 775016 RedBean_Facade::find( )
8 2.0335 775384 RedBean_OODB->find( )
9 2.0335 775384 RedBean_QueryWriter_AQueryWriter->selectRecord( )
10 2.0335 775448 RedBean_QueryWriter_AQueryWriter->safeTable( )
11 2.0335 775536 RedBean_QueryWriter_AQueryWriter->check( )
12 2.0335 775536 RedBean_Adapter_DBAdapter->escape( )
13 2.0335 775536 RedBean_Driver_PDO->Escape( )
14 2.0335 775536 RedBean_Driver_PDO->connect( )
15 2.0336 776200 PDO->__construct( ) //Cannot connect to database
16 4.0433 782768 ErrorHandler->handleError( ) //Error converted to exception

我有一种感觉,这真的无法避免,而且在生产环境中 display_errors 无论如何都会被关闭。但是,我对这个解决方案并不完全满意,因为它似乎不是很“干净”。

最佳答案

您无法在 PHP 中捕获致命异常。可悲的是!注册一个刷新输出缓冲区的关闭函数是你所能做的。由于您已经具有关闭功能,因此其中的某些内容导致了问题。我会试试这个:

// This must be called before any code is executed
register_shutdown_function( 'shutdownFunction' );

function shutdownFunction() {
// process code - be careful not to throw another fatal exception
try {
call_user_func( 'session_write_close' );
} catch() {}
ob_clean();
}

...除此之外,我认为你被卡住了

关于php - ExceptionHandler 没有捕获所有未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com