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

Throw Exception, message passed into constructor won't appear in PHP error

我有一个给定的 class,其中包含一些方法,当满足某些错误条件时,其中一个会抛出如下异常:

PHP

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

如果我不处理这个错误,PHP 将按预期显示 "Fatal Error" 消息,但不会显示传递到 [=12= 的构造函数的第一个参数中的自定义消息]:

Fatal error: in /home/uxxxxxxxxx/public_html/test.php on line 87

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

Fatal error: Nem kezdhető új "insert" utasítás. in /home/uxxxxxxxxx/public_html/test.php on line 87

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

注意:将 LogicException 换成 Exception 不会改变任何东西。

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

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

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

您所要做的就是:

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

编辑:但在上面提到的,在您的自定义错误之前必须触发另一个错误,因为它不会显示 "Fatal error"

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

注意:我没有在 初始 问题中包含解决方案的关键,即原始消息本身。在问题中,我将消息翻译成英文希望更好的可读性,但原来的消息中有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