【问题标题】:PhP Exception message shown despite been caught by the exception handler尽管被异常处理程序捕获,但仍显示 PhP 异常消息
【发布时间】:2013-12-13 12:09:17
【问题描述】:

我在我的 PhP 程序中使用 set_exception_handler() 设置了一个异常处理程序,它实际上工作正常。从某种意义上说,它确实捕获了我没有处理的异常,并且按照处理程序中的规定,记录了异常详细信息。那么,我为什么要抱怨呢?问题是除了在异常处理程序中使用文件名和行号记录正确的详细信息外,它还在浏览器中显示以下消息:

     Fatal error: Exception thrown without a stack frame in Unknown on line 0

我的信念是,这个特定的异常消息可能来自 stdout 流,而处理程序捕获的异常来自 stderr 流。另一种可能性是上述消息是由错误处理程序模块发出的,而不是由 PhP 的异常处理程序模块发出的。无论如何,我希望所有异常消息都发送给一个处理程序。我还有一个错误处理程序设置如下:

    set_error_handler('SS_error_handler', E_ALL); 

如何处理这种情况?致命错误消息是否来自 PhP 的错误消息报告模块?如果是这样,异常处理程序和错误处理程序之间是否存在重叠,因为它们都被某些错误/异常触发?如果相关,我想补充一点,这个特定的异常是 MySQL PDO 语句引发的。

任何解释将不胜感激。

【问题讨论】:

    标签: php mysql exception handler


    【解决方案1】:

    在导致错误的行的开头添加@字符,这将使其静音。

    你也可以使用 ini_set('display_errors', 0),这会让所有人都沉默:)

    但普通人只是try{} catch ( e) { trigger_error(e, E_USER_ERROR);}

    【讨论】:

    • 最糟糕的建议!
    • 等等,我有更多建议,只是谷歌搜索))
    • 现在更糟了...永远不要抑制错误,始终记录并分析它们!
    • 我只是分享如何“摆脱”消息的常识,我通常只是将它们记录到文件中
    • 我正在捕获异常,它被捕获、处理和记录。错误消息来自哪里是我的问题。我的阅读告诉我,PhP 有两个独立的模块,旧的错误报告和错误处理以及新的异常处理。那里有某种形式的重叠吗?某些条件会同时触发两者吗?
    【解决方案2】:

    请参考文档:http://php.net/manual/en/function.set-error-handler.php

    以下错误类型无法用用户定义的方式处理 功能:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING 和大部分 E_STRICT 在 调用 set_error_handler() 的文件。

    因此,您不能使用set_error_handler 来捕获异常,您应该使用正确的try { } catch { } 块。

    【讨论】:

    • 请仔细阅读我的问题。第一行说我正在使用异常处理程序。如果你没有明确地捕获一个表达式,异常处理程序应该捕获它并且它确实捕获了它。问题是即使处理了异常,错误消息的来源是什么?是来自PhP的异常处理模块还是错误处理模块还是有其他解释。
    猜你喜欢
    • 2012-02-08
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2017-05-02
    • 2018-05-30
    • 2011-09-16
    相关资源
    最近更新 更多