使用异常退出PHP应用程序

时间:2012-03-19 18:02:20

标签: php exception fastcgi exit

我的应用程序有一个注册的关闭功能,似乎有一些问题和我使用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.
 */

2 个答案:

答案 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
}