我的应用程序有一个注册的关闭功能,似乎有一些问题与我的方法与try/catch使用异常退出应用程序(而不是使用exit()方法由于FastCGI不喜欢这个)。使用异常退出PHP应用程序
我的问题是,如果try/catch块中不是ExitApp异常引发另一个异常,它会导致一些意外的结果,最终结果是ExitApp异常未被捕获。
我在PHP 5.3.6上看到这个,现在要在另一个版本上测试它,但我很好奇,如果任何人都可以立即指出这里有什么问题。
<?php
// Define dummy exception class
class ExitApp extends Exception {}
try {
// Define shutdown function
function shutdown() {
echo "Shutting down...";
throw new ExitApp;
}
register_shutdown_function("shutdown");
// Throw exception!
throw new Exception("EXCEPTION!");
} catch(ExitApp $e) {
echo "Catching the exit exception!";
}
/**
* Expected Result: Uncaught Exception Error and then "Catching the exit exception!" is printed.
* Actual Result: Uncaught Exception Error for "Exception" and then Uncaught Exception Error for "ExitApp" even though it's being caught.
*/
示例代码已经过调整以更好地反映我的真实情况。至于捕捉其他异常,这是重点。我只想捕捉ExitApp异常并且不执行任何操作。所有其他异常将被全局异常处理程序捕获。 – saverio 2012-03-19 18:34:34
您的更改变化不大。第一次使用关闭功能时引发异常,而不是定义函数的位置。更重要的是,关闭函数在退出,致命错误和未捕获异常之后被调用,因此您不应该将其注册为关闭函数。让脚本正常进行到最后,并在必要时抛出它。如果我理解正确,只要在注册为shutdown的地方调用'shutdown()',那么任何代码都不会被执行,所以不会有未捕获的异常。 – 2012-03-19 18:43:26
看来这里面临的更大问题是异常无法通过关闭函数内的try/catch捕获。看起来,当关闭功能被调用时,它们将不在标准范围内。我在设计这个解决方案时并没有意识到。 – saverio 2012-03-19 19:19:53