Почему PHP генерирует фатальные ошибки и не работает с HTTP 500, хотя использует блоки try / catch? - PullRequest
0 голосов
/ 06 февраля 2019

В моих журналах AWS есть такие записи:

[Ср. 06 февраля 10: 12: 22.306730 2019] [php7: error] [pid 28445] [client 172.31.10.7:55646]Неустранимая ошибка PHP: необработанная ошибка: класс 'comet_cache' не найден в /var/app/current/project-website-wordpress/wp-content/mu-plugins/comet-cache-ec2-enabler.php:41

Эти записи регистрируются, когда происходит какой-то определенный запрос HTTP 500.

После проверки кода я обнаружил следующее (в строке 41 в упомянутом файле):

try {
   comet_cache::clear();
} catch(Exception $e) {
   // if comet cache is not activated, we want to continue anyway
}

Это в основном имеет смысл - кажется, что класс не найден, но выполнение должно просто продолжаться, если это так.Почему PHP останавливается?

1 Ответ

0 голосов
/ 05 марта 2019

Вы не ловите, потому что пытаетесь поймать \Exception, но то, что выдается, это \Error.

Учитывая ваше сообщение об ошибке, я бы сказал, что вы используете PHP> = 7 (Вы должны указать, что обработка ошибок значительно изменилась с версии 5 до версии 7).

В PHP> = 7, большинство фатальных ошибок сообщается не путем возникновения ошибки,но бросая Error объект .

Таким образом, ваше утверждение можно переписать так:

try {
    $a = new ClassNotFindable();
}
catch (\Error $e) {
   // do your catching
}

Более того, оба класса Error и Exception реализуют Throwable интерфейс, чтобы вы могли поймать это непосредственно:

<?php

try {
    $a = new NotFound();
}
catch (\Throwable $t) {
    echo "caught!\n";

    echo $t->getMessage(), " at ", $t->getFile(), ":", $t->getLine(), "\n";
}

Вы можете видеть, что он работает здесь .

Это никак не связано с AWS, а простоВещь PHPЕсли бы вы использовали PHP <7, он все равно не был бы перехвачен, но в этом случае, потому что распространенные ошибки не являются исключениями. </p>

Если вы использовали PHP5, чтобы иметь возможность отловить ошибку как исключение, вы 'Мне нужно настроить собственный обработчик ошибок.Пример в руководстве выглядит вполне уместным:

function exception_error_handler($severidad, $mensaje, $fichero, $línea) {
   if (!(error_reporting() & $severidad)) {
       // Este código de error no está incluido en error_reporting
       return;
   }
   throw new ErrorException($mensaje, 0, $severidad, $fichero, $línea);
}
set_error_handler("exception_error_handler");
...