【问题标题】:Does a PHP exception stop execution?PHP 异常会停止执行吗?
【发布时间】:2011-01-19 02:49:48
【问题描述】:
<?php
     function some_function($arg) {
         if($filter->check_for_safe_input($arg)) {
             throw new Exception("Hacking Attempt");
         }
         do_some_database_stuff($arg);
     }
 ?>

在上面的代码示例中,如果check_for_safe_input 失败,是否会调用do_some_database_stuff,或者异常是否会停止函数运行?这是我一直不太确定的事情,通常我只是将 do_some_database_stuff 之类的函数粘贴在 else 语句中以确保,但这往往会导致大量嵌套的函数。

【问题讨论】:

    标签: php exception


    【解决方案1】:

    查看有关异常的 PHP 手册。

    当抛出异常时,代码 以下声明将不会 执行,PHP 将尝试查找 第一个匹配的 catch 块。如果 未捕获异常,PHP 致命 错误将发出“未捕获 异常...”消息,除非 处理程序已定义为 set_exception_handler().

    php.net/exceptions

    是的,函数的其余部分没有被执行,而是发生了致命错误。
    如果您捕获了异常,则脚本会在相应的 catch 块中继续执行,抛出异常的函数与 catch 块“之间”的所有内容都不会执行。

    【讨论】:

      【解决方案2】:

      是的,未捕获的异常会导致导致脚本执行停止的致命错误。所以如果抛出异常,do_some_database_stuff 函数将不会被调用。您可以在this article 中阅读有关异常的更多信息。

      【讨论】:

      • 如果在调用这个的函数中被抓到了怎么办?那么这个函数的其余部分会运行吗?
      • 不,一旦你抛出一个异常,函数的执行就会停止(就像你返回了一些结果一样),异常会在调用堆栈中冒泡,直到找到catch 语句。
      • 否,在捕获函数中恢复执行;你不能(在 PHP 中)从异常停止的地方恢复执行。
      • @bobince,实际上,这样似乎更好。一旦抛出异常,我为什么要继续执行?
      • @aditya:确实,这是所有语言中异常工作的普遍期望方式。不过,一个持续的异常将是一个有趣的语言特性。您可以将它用于警告,堆栈中的调用者可以决定警告异常是严重的还是可忽略的,或者作为类似协程的构造。
      【解决方案3】:

      如果未捕获异常,将结束脚本执行。

      PHP manual chapter on Exceptions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        相关资源
        最近更新 更多