执行这段简单的代码后:
$message = 'some text '.inet_pton('119.252.33.171');
throw new \Exception($message);PHP返回致命错误
Fatal error</b>: in ...此代码应返回
Fatal error: Uncaught Exception: ..但这并没有发生。在此消息中,错误发生在"Exception“类中!
Code example 1 from sandbox.onlinephpfunctions.com (注释和取消注释2行代码3-4和6-7)
Code example 2 from sandbox.onlinephpfunctions.com
在转换许多其他IP时,会注意到此行为。在“抛出新的”之前,我用下面这行代码解决了这个问题:
$message = preg_replace( '/[^[:print:]\r\n]/', '_', $message);如何正确转义消息中的字符以避免出现异常或PHP错误?
我的PHP版本是7.2
发布于 2019-02-08 09:22:27
这是因为inet_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";
}产生
string(4) "w�!�"
119
252
33
171比较这两行
throw new \Exception(chr(33)); // Displays stacktrace
throw new \Exception(chr(252)); // Fails to output我的猜测是,PHP试图将字符串格式化为UTF-8以将异常消息打印到stdout时发生错误,但是传入了无效的UTF-8字符串,写入/解码失败。
无论哪种方式,似乎都是PHP中的一个bug。
发布于 2019-02-09 11:07:35
您错误地使用了inet_pton(),因为它是这样做的:
inet_pton — Converts a human readable IP address to its packed in_addr representation您应该在不调用inet_pton()的情况下将地址附加到字符串。
现在,关于错误。
这个错误并没有出现在我的所有PHP设置中,从5.5.12到7.2.8。这是我从PHP 5.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我从其他版本中得到了相同的“未捕获异常”错误,并得到了https://3v4l.org/Klpep的确认。
这意味着错误一定是由PHP设置中出现的异常消息的后处理引起的,但在3v4l.org的设置和我的设置中不会发生。
我想到一个可能的罪魁祸首是html_errors配置选项。我将它设置为On,以了解将要发生的事情,果然,我理解了您的错误:
<br />
<b>Fatal error</b>: in <b>C:\wamp\www\so\54584039.php</b> on line <b>5</b><br />因此,解决方案是将html_errors设置为Off。
我强烈建议您始终将其设置为Off,因为如果您正在处理JSON输出(或其他格式),则HTML是无用的,而且它还会使错误消息更难阅读。
https://stackoverflow.com/questions/54584039
复制相似问题