【问题标题】:How does throw work?投掷如何工作?
【发布时间】:2014-04-27 03:36:40
【问题描述】:

我想知道throw 在 PHP 中是如何工作的。

例如,它的行为类似于die()exit()?我怎么知道内部做了什么?

我之所以问这个问题是因为我看到 Kohana 使用他们的 $this->redirect() 方法和一个 throw 来终止脚本执行而不是传统的退出。

【问题讨论】:

  • 从这里开始:lxr.php.net
  • @Closevoter(s) 这与超级用户无关!
  • 你想如何“内部化”到这里?
  • @deceze 显然他并不是说它是如何在引擎盖下用 C 编写的

标签: php exception throw


【解决方案1】:

throw 根本不像 exitdie。抛出异常不会自动终止应用程序,应用程序可以捕获抛出的异常。只有当一个异常没有被捕获时,应用程序才会被终止。

try {
    throw new Exception;
} catch (Exception $e) {
    echo 'caught it';
}

echo 'not dead yet';

异常是一种以比简单的return false 语句允许的更灵活和严格的方式向更高调用者发出错误信号的机制。它们无法与简单的exitdie 相提并论。

我不知道 Kohana 究竟做了什么,但是抛出异常而不是使用简单的 exitdie 是对异常的滥用。只有在异常错误情况下才应该抛出异常。

【讨论】:

    【解决方案2】:

    作为already explained,您使用throw 来抛出可以在您的应用程序中“进一步”捕获的异常。

    当您使用对象和面向对象的编程时,您开始将您制作的每一个对象编码为可以提供给其他人的独立对象。这些公共方法是一个API,每个公共方法上方的 phpdoc 详细说明了该类在某些情况下可能抛出的异常

    所以,有人创建了一个独立的对象来为你做一些事情,比如写入磁盘。您想使用此对象,因此您查看文档并看到当对象由于权限问题而无法写入磁盘时,它会抛出 PermissionsException

    你的代码中使用了这个人的对象,你现在知道你应该捕捉那个异常,记录它,然后继续你希望你的应用程序在给定的情况下工作情况(例如,如果是通过 AJAX 调用,则向用户显示一个很好的错误)。

    因此,了解这一点后,当您编写自己的对象时,请针对不同的情况设置描述性例外情况,您将对象交给的人可以在他们的自己的应用程序。

    dieexit 您都不想在生产应用程序中使用。当您执行var_dump() 然后想要在之后立即停止应用程序执行或者您想要完全停止脚本运行时,它们对于调试非常有用。

    至于为什么您找到的特定代码会这样做,您应该询问开发人员是否没有合理地记录它。

    【讨论】:

    • 感谢您的解释!我将尝试更多地了解 Kohana 的 redirect()
    • 我不喜欢选择的答案以“如前所述”开头。不幸的是,对我来说,它没有。你是我第一次接触这个答案。
    • @Hoytman 有一个previous answer that already alluded to this,这是引用的解释。你花很多时间解释你不喜欢“已经解释过的”是浪费;最好把注意力集中在对自己和他人更有益的事情上。此外,如果您有足够的权限,您可以编辑,我可以接受它,以供将来参考。
    • 我对这些消息感到困惑(看起来像是论坛)。作为讨论的新访客,它读作是对 OP 的谴责。也许如果它是一个链接......
    • 我的建议是在回复 cmets 时检查您的态度 - 说您立即不喜欢某事,因为新手不会让您有任何收获。以尊重的态度提问。你会走得更远。我也更新了你的建议,谢谢:)
    【解决方案3】:

    在不使用 try/catch 的情况下使用“throw”会以“可捕获的致命错误”终止脚本。据我所知,以这种方式使用“投掷”没有任何好处。如果你想终止一个脚本,你应该使用exit(),所以你不需要隐藏错误信息。

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 2023-03-16
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多