PHP:错误处理的控制流是什么?

PHP:错误处理的控制流是什么?,php,error-handling,Php,Error Handling,我是PHP新手,所以如果这看起来很愚蠢,我向您道歉。我四处搜索,找不到任何能具体解释我要找什么的东西 最终我有两个目标 在生产中,当发生意外错误时,向用户显示默认的“oops”页面 当出现预期错误时,请在PHP不死机的情况下处理它 我的PHP错误处理的心智模型是参差不齐的,以至于我无法满怀信心地向前迈进,也无法找到任何关于这个过程的好文档 举一些人为的例子 用户发出请求,与数据库的连接失败,我们显示一条oops消息 用户发出请求,脚本无法正确解析,我们将显示一条oops消息 用户发出请求时,我们

我是PHP新手,所以如果这看起来很愚蠢,我向您道歉。我四处搜索,找不到任何能具体解释我要找什么的东西

最终我有两个目标

  • 在生产中,当发生意外错误时,向用户显示默认的“oops”页面
  • 当出现预期错误时,请在PHP不死机的情况下处理它
  • 我的PHP错误处理的心智模型是参差不齐的,以至于我无法满怀信心地向前迈进,也无法找到任何关于这个过程的好文档

    举一些人为的例子

  • 用户发出请求,与数据库的连接失败,我们显示一条oops消息
  • 用户发出请求,脚本无法正确解析,我们将显示一条oops消息
  • 用户发出请求时,我们使用乐观锁定查询具有更新的数据库。它失败了,因此我们通知用户对象已更新
  • 我认为我的大部分困惑是围绕着哪些错误导致脚本死亡,哪些错误不导致脚本死亡(使用默认处理程序),以及当脚本死亡时,我们如何优雅地通知用户

    另外,是否有任何标准php函数/对象使用异常?如果我选择用C风格处理异常,我在任何时候都不会感到惊讶,是吗?PHP6会发生变化吗?如果是这样的话,我将努力总结使用c风格和异常之间的区别,但如果不是这样,我宁愿在整个PHP5中始终使用c风格。这不是我想解决的问题,除非我绝对需要

    编辑:
    我刚刚意识到内容与标题不太匹配。我想知道,当出现错误时,PHP的逻辑流程是什么?通过这种方式,我可以更好地理解如何在PHP中实现错误处理的目标。

    异常被很好地集成到
    PHP5
    中。它们与Java/C++异常具有相同的
    try/catch
    语法。发生预期错误时使用它们


    如果你想显示一个自定义的“oops”页面,你可以结合使用。对于更多的提示,请考虑Link。

    < P>大多数PHP的内置凝灰岩会触发默认设置中无法真正处理的错误。

    不过,您可以通过设置自定义错误处理程序并引发异常而不是错误来解决此问题。(如果可能的话,PHP将在内部处理错误之前运行处理程序,这样您就可以用正常的方式捕获异常。)

    在我的回答中,我已经编写了一系列代码,您可以在这种情况下使用:


    如果php不能解析你的文件,你就完蛋了,php在大多数情况下都会崩溃,因为它不能解析文件。尽管您可以尝试编写自己的include函数,该函数在包含之前是一个文件,如果
    eval
    失败,则跳过该函数。不过,您需要确保基本上可以信任这些文件。

    这在分析错误的情况下不起作用。这不是我想要的。当一个不可恢复的错误被触发(E_错误)并且没有用户定义的处理程序可以优雅地处理它时。如果解释器是在当前执行行中触发的(因此不是在您实际使用的某些函数中),E_PARSE将终止解释器。更多信息请参见。谢谢你,克里斯,这正是我想要的。我曾试图更早地找到该信息,但失败了。在我看来,我可以为E_错误设置一个处理程序并将其转到oops页面,然后使用trigger_ERROR()为E_USER_错误启动另一个处理程序,该处理程序也会转到“oops”页面,以处理其他不可恢复的情况,例如无法连接到DB。根据文档,E_用户_错误是“就像E_错误一样”。如果默认的错误处理程序得到它,我假设它将终止脚本,就像E_error?还有最后一个问题(我将把结果放回原始文章中)。如果我使用函数“error_log”记录错误,它会将错误记录到默认错误处理程序获取错误时记录的相同位置吗?如果没有,我需要使用什么功能才能这样做?我不喜欢有多个错误记录机制的想法,我希望避免捕获所有错误只是为了记录它们,因为可能的性能原因(如果您认为这种担心是不正确的,请告诉我)。根据消息,将记录到系统的默认日志位置(因此,无论服务器配置中设置了什么)如果您没有覆盖呼叫中的目标。