抛出异常,传递给构造函数的消息不会出现在PHP错误中

时间:2015-05-11 17:43:55

标签: php exception-handling

我有一个给定的类,其中包含一些方法,其中一个在满足某些错误标准时会按以下方式抛出异常:

PHP

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

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

  

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

我希望在try ... catch块之外抛出异常会在浏览器中产生以下输出:

  

致命错误:Nemkezdhetőúj“insert”utasítás。在 /home/uxxxxxxxxx/public_html/test.php 87

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

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

2 个答案:

答案 0 :(得分:3)

注意:我没有在初始问题中包含解决方案的密钥,即原始邮件本身。在这个问题中,我将消息翻译成英文,以期提高可读性,但原来的内容中有UTF-8字符。

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

  

Nemkezdhetőú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

答案 1 :(得分:0)

您可以使用try {...} catch块来包围上述调用,但是您可以根据自己的需要声明脚本的行为。

捕获时,异常是一个可以包含某些数据的对象(就像使用自定义消息一样)。您可以根据自己的意愿提取这些数据。

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

你所要做的就是:

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

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

我希望这对你有所帮助,对不好的英格拉多道歉:(