我的应用程序有一个注册的关闭功能,似乎有一些问题和我使用try / catch的异常退出应用程序的方法(而不是使用exit()方法,因为FastCGI不喜欢这个)
我的问题是,如果在不是ExitApp异常的try / catch块中抛出另一个异常,它会导致一些意外结果,最终结果是没有捕获到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.
*/
答案 0 :(得分:0)
您的 shutdown()函数甚至不在try / catch块中,因此它永远不会跳转到此异常类型的catch。它将在退出上运行,因此您将不再位于该try / catch块中。
在更精神上,try / catch不适用于流量控制。我不太确定你为什么试图抛出这个来导致脚本退出,而不是只是调用你自己的 shutdown()方法。
希望有所帮助。
答案 1 :(得分:0)
您的代码有错误的期望。首先,如果你在shutdown函数中抛出异常,你将总是以未捕获的异常结束 - 在tr / catch块之外调用shutdown函数。
其次,您没有尝试拦截未知异常 - 您只捕获ExitApp
类型。你可能想尝试这样的事情:
try {
//some stuff
} catch(ExitApp $ea) {
//normal exit, nothing to do here
} catch(Exception $e){
//something rather unexpected, log it
}