【问题标题】:Does Exception Terminate Program?异常会终止程序吗?
【发布时间】:2015-02-17 22:28:12
【问题描述】:

考虑以下代码,由 cron 运行:

try {
    $count = $stmt->execute ( $queryArray );
}
catch ( PDOException $ex ) {
    fwrite ( $fp, '  "exception" at line: ' . (__LINE__ - 3). ",  " . $ex -> getMessage () . "\n" );
    throw new RuntimeException (
         basename (__FILE__) . '::' . __METHOD__ . ' - Execute query failed: ' . $ex -> getMessage ()  );
}

throw new RuntimeException 重新抛出是否导致程序停止?换句话说,catch & fwrite 语句是否足以“捕获”异常并允许程序继续运行?

throw 文档含糊不清。唯一的参考是(link to) PHP Exceptions中的PHP Fatal Error

当抛出异常时,语句后面的代码将不会被执行,PHP 将尝试找到第一个匹配的 catch 块。如果未捕获到异常,则会发出 PHP 致命错误并显示“未捕获异常 ...”消息,除非已使用 set_exception_handler() 定义了处理程序。

【问题讨论】:

    标签: php exception


    【解决方案1】:

    是否通过 throw new RuntimeException 重新抛出导致程序停止?

    是的,因为根据文档没有匹配的捕获。为了继续执行,您需要使用嵌套的try/catch 来处理第二个异常 (RuntimeException),这通常不是一个好主意:

    try {
       // something with PDO that generates an exception
    } catch (PDOException $e) {
       // do some stuff
       try {
           throw new RuntimeException();
       } catch (RuntimeException()) {
         // do something else
       }
    }
    

    换句话说,catch & fwrite 语句是否足以“捕获”异常并允许程序继续运行?

    如果您想继续执行该程序,则不需要抛出第二个异常。但是,在您抛出该异常之前发生的任何事情都会发生。因此,在您的示例中,fwrite 仍然会发生,当遇到 RuntimeException 时,程序只会停止。

    【讨论】:

    • 你的意思是:'但是,在你抛出那个异常之前发生的事情会发生。所以在你的例子中,frwite 仍然会发生......'(错别字?)我希望这句话能为我解决问题。
    • 是的.. 错字s/and thing/anything - 已在答案中更正。
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多