Сообщение для класса «Exception» вызывает PHP Fatal Error - PullRequest
0 голосов
/ 08 февраля 2019

После выполнения этого простого кода:

$message = 'some text '.inet_pton('119.252.33.171');
throw new \Exception($message);

PHP возвращает фатальную ошибку

Fatal error</b>: in ...

Ожидается, что этот код вернет

Fatal error: Uncaught Exception: ..

Но это не такпроисходит.При этом сообщении ошибка возникает в классе «Исключение»!

Пример кода 1 из sandbox.onlinephpfunctions.com (комментарий и раскомментируйте 2 строки кода 3-4 и 6-7)

Пример кода 2 с sandbox.onlinephpfunctions.com

Такое поведение наблюдается при преобразовании многих других IP-адресов.На данный момент я решил проблему со следующей строкой перед «throw new»:

$message = preg_replace( '/[^[:print:]\r\n]/', '_', $message);

Как правильно экранировать символы в сообщении для Exception или это ошибка PHP?

Моя версия PHP7,2

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Вы используете inet_pton() неправильно, потому что это то, что он делает:

inet_pton — Converts a human readable IP address to its packed in_addr representation

Вы должны добавить адрес к строке, не вызывая inet_pton().

Теперь оerror.

Ошибка возникает не во всех моих настройках 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

Я получил ту же ошибку «Uncaught исключения» из других версий, подтвержденную 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 бесполезно и затрудняет чтение сообщения об ошибке.

0 голосов
/ 08 февраля 2019

Это может быть связано с тем, что 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

Сравните эти дваlines

throw new \Exception(chr(33)); // Displays stacktrace
throw new \Exception(chr(252)); // Fails to output

Я полагаю, что при попытке PHP отформатировать строку как UTF-8, чтобы вывести сообщение об исключении в стандартный вывод, возникает ошибка, но в нее передается недопустимая строка UTF-8 и выполняется запись/ decoding не удается.

В любом случае, похоже на ошибку в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...