【问题标题】:Throw Exception, message passed into constructor won't appear in PHP error抛出异常,传递给构造函数的消息不会出现在 PHP 错误中
【发布时间】:2015-05-11 17:43:55
【问题描述】:

我有一个给定的类,其中包含一些方法,当满足某些错误标准时,其中一个会根据以下情况引发异常:

PHP

if ($this->mode !== null) {
    throw new LogicException('Nem kezdhető új "insert" utasítás.');
}

如果我不处理此错误,PHP 将按预期显示“致命错误”消息,但不会显示传递给 LogicException 的构造函数的第一个参数的自定义消息:

致命错误:在 /home/uxxxxxxxxx/public_html/test.php87

我预计在 try ... catch 块之外引发异常会在浏览器中产生以下输出:

致命错误:Nem kezdhető új "insert" utasítás。在 /home/uxxxxxxxxx/public_html/test.php87

如果我指定自定义异常处理程序,则可以显示原始消息,尽管样式不同。我知道如何模仿 PHP 处理可捕获的致命错误的原始行为,但我确实认为应该显示消息而不需要这样做,纯粹是通过引发未捕获的异常。

注意:将LogicException 交换为Exception 不会改变任何内容。

【问题讨论】:

  • 作品here.
  • @hynner 是的,这也是它应该在这里工作的方式。我没有会影响 PHP 对未捕获异常的响应的杂散包含、函数或 ini 覆盖。
  • 我会假设您看到的致命错误不是这个 throw 语句的结果,并且您在其他地方还有另一个致命错误。也许发布完整的脚本test.php 或至少将其剥离以消除可能的错误。
  • @JonathanKuhn 这个问题缺少一个小细节,即 original 异常消息本身。原始消息是“Nem kezdhető új INSERT utasítás”,这揭示了问题的真正本质 - 没有 UTF-8 编码的文件中的异常与 UTF-8 字符。我将编辑问题,因为它是解决方案的 key

标签: php exception-handling


【解决方案1】:

注意:我没有在我的初始问题中包含解决方案的关键,即原始消息本身。在问题中,我将消息翻译成英文以希望更好的可读性,但原始消息中包含 UTF-8 字符。

事实证明,问题在于原始消息,

Nem kezdhető új "insert" utasítás.

包含 UTF-8 字符,如果在没有 UTF-8 编码的文件中使用,则会中断异常处理。相应地切换文件编码解决了这个问题。

以下主题有许多描述问题的高质量答案:PHP 5.4 throw exception - Can't see message with ISO-8859-1 encoded string message

【讨论】:

    【解决方案2】:

    您可以用 try {...} catch 块包围上述调用,但您可以自行声明脚本的行为。

    当被捕获时,异常是一个可以包含一些数据的对象(例如您的自定义消息)。借助方法,您可以根据自己的意愿提取这些数据。

    如果我们查看http://php.net/manual/fr/class.logicexception.php,我们可以看到有一个 getMessage(...) 方法可以返回您存储的消息。

    你所要做的就是:

    try {
    // the code reaching the one above
    }
    catch (LogicException $e) {
      echo $e->getMessage();
    }
    

    编辑:但如上所述,在您的自定义错误之前必须触发另一个错误,因为它不会显示“致命错误”

    我希望这对你有帮助,抱歉 englado 不好 :(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多