首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类"Exception“的消息导致PHP致命错误

类"Exception“的消息导致PHP致命错误
EN

Stack Overflow用户
提问于 2019-02-08 07:42:38
回答 2查看 93关注 0票数 0

执行这段简单的代码后:

代码语言:javascript
复制
$message = 'some text '.inet_pton('119.252.33.171');
throw new \Exception($message);

PHP返回致命错误

代码语言:javascript
复制
Fatal error</b>: in ...

此代码应返回

代码语言:javascript
复制
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时,会注意到此行为。在“抛出新的”之前,我用下面这行代码解决了这个问题:

代码语言:javascript
复制
$message = preg_replace( '/[^[:print:]\r\n]/', '_', $message);

如何正确转义消息中的字符以避免出现异常或PHP错误?

我的PHP版本是7.2

EN

回答 2

Stack Overflow用户

发布于 2019-02-08 09:22:27

这是因为inet_pton()的目的不是输出字符串,而是按网络顺序输出字节(我不记得它是小端还是大端)。

异常消息不应包含字节,而应包含可打印的字符。但是,您可以将纯字节放入字符串中。然后将它们解码为(可能) UTF-8或其他编码,以显示可读文本。

下面的代码

代码语言:javascript
复制
$message = inet_pton('119.252.33.171');
var_dump($message);
for($i = 0; $i < strlen($message); $i++)
{
   echo ord($message[$i]) . "\n";
}

产生

代码语言:javascript
复制
string(4) "w�!�"
119
252
33
171

比较这两行

代码语言:javascript
复制
throw new \Exception(chr(33)); // Displays stacktrace
throw new \Exception(chr(252)); // Fails to output

我的猜测是,PHP试图将字符串格式化为UTF-8以将异常消息打印到stdout时发生错误,但是传入了无效的UTF-8字符串,写入/解码失败。

无论哪种方式,似乎都是PHP中的一个bug。

票数 1
EN

Stack Overflow用户

发布于 2019-02-09 11:07:35

您错误地使用了inet_pton(),因为它是这样做的:

代码语言:javascript
复制
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得到的错误消息:

代码语言:javascript
复制
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,以了解将要发生的事情,果然,我理解了您的错误:

代码语言:javascript
复制
<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是无用的,而且它还会使错误消息更难阅读。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54584039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档