类“Exception”的消息导致PHP致命错误
执行此简单代码后:类“Exception”的消息导致PHP致命错误,php,exception,Php,Exception,执行此简单代码后: $message = 'some text '.inet_pton('119.252.33.171'); throw new \Exception($message); PHP返回致命错误 Fatal error</b>: in ... 但这并没有发生。通过此消息,类异常中会发生错误 注释和取消注释代码3-4和6-7的两行 转换许多其他IP时会注意到此行为。 目前,在抛出新代码之前,我使用以下行解决了问题: $message = preg_replace( '
$message = 'some text '.inet_pton('119.252.33.171');
throw new \Exception($message);
PHP返回致命错误
Fatal error</b>: in ...
但这并没有发生。通过此消息,类异常中会发生错误
注释和取消注释代码3-4和6-7的两行
转换许多其他IP时会注意到此行为。
目前,在抛出新代码之前,我使用以下行解决了问题:
$message = preg_replace( '/[^[:print:]\r\n]/', '_', $message);
如何正确地转义消息中的字符以防出现异常或PHP错误
我的PHP版本是7.2,这是因为inet\u pton不是用来输出字符串的,而是按网络顺序输出字节的,我不记得它是小端还是大端
异常消息不包含字节,而是包含可打印字符。但是,您可以将纯字节放入字符串中。然后将其解码为UTF-8或其他编码以显示可读文本
下面的代码
$message = inet_pton('119.252.33.171');
var_dump($message);
for($i = 0; $i < strlen($message); $i++)
{
echo ord($message[$i]) . "\n";
}
比较这两条线
throw new \Exception(chr(33)); // Displays stacktrace
throw new \Exception(chr(252)); // Fails to output
我的猜测是,当PHP试图将字符串格式化为UTF-8以将异常消息打印到stdout时,会发生错误,但传入了无效的UTF-8字符串,写入/解码失败
无论哪种方式,都像是PHP中的一个bug。您不正确地使用了inet\u pton,因为它就是这样做的:
inet_pton — Converts a human readable IP address to its packed in_addr representation
您应该在不调用inet\u pton的情况下将地址附加到字符串
现在,关于错误
从5.5.12到7.2.8,我的所有PHP设置中都不会出现此错误。
这是我从PHP5.5.12中得到的错误消息:
Fatal error: Uncaught exception 'Exception' with message 'some text wü!«' in C:\wamp\www\so\54584039.php:5 Stack trace: #0 {main} thrown in C:\wamp\www\so\54584039.php on line 5
我从其他版本得到了相同的未捕获异常错误,由确认
这意味着该错误必须由PHP设置中发生的异常消息的后处理引起
但在3v4l.org的设置和我的设置中没有出现
我突然想到,一个可能的罪魁祸首是html_错误配置选项。
我将其设置为On,以了解将要发生的事情,果然,我发现了您的错误:
<br />
<b>Fatal error</b>: in <b>C:\wamp\www\so\54584039.php</b> on line <b>5</b><br />
因此,解决方案是将html_错误设置为Off
我强烈建议您始终将其设置为Off,
因为如果您正在处理JSON输出或其他格式,HTML格式是无用的,而且还会使错误消息更难阅读。当您抛出异常时,您的标题和问题不匹配且令人困惑,这当然会导致致命错误。您捕获到异常了吗?没有,因为错误消息“some text”.inet_pton'119.252.33.171';它本身会在异常类中导致错误。在您的主机上运行我的示例并查看结果。我无法仅通过inet\u pton调用重现该错误。你确定这就是异常的原因吗?@Miron你确定这个致命错误吗?在我的7.2.11版上,设置了显示错误和E_ALL时不会发生这种情况。致命错误的确切信息是什么?致命错误:在。。。在第92行,这是PHP错误-这是真的。只有在您的示例中,最好使用mb_ord。
Fatal error: Uncaught exception 'Exception' with message 'some text wü!«' in C:\wamp\www\so\54584039.php:5 Stack trace: #0 {main} thrown in C:\wamp\www\so\54584039.php on line 5
<br />
<b>Fatal error</b>: in <b>C:\wamp\www\so\54584039.php</b> on line <b>5</b><br />