PHP 7 try — catch: невозможно отловить & quat; Catchable fatal error & quot;

Я играю с try - catch блок:

<?php
try {
$str = "http://rejstrik-firem.kurzy.cz/73631604";
$domOb = new DOMDocument();
$html = $domOb->loadHTMLFile($str);
$domOb->preserveWhiteSpace = false;
$container = $domOb->getElementById('ormaininfotab');
echo $container; // <========= this is intended error which I want catch
}
catch (Exception $e) {
echo "Exception" . $e->getMessage() . ". File: " . $e->getFile() . ", line: " . $e->getLine();
}

catch (Error $e) {
echo "Error" . $e->getMessage() . ". File: " . $e->getFile() . ", line: " . $e->getLine();
}
?>

Мой результат таков:

Исправляемая фатальная ошибка: объект класса DOMElement не может быть
преобразуется в строку в /var/www/html/cirkve_ares/test.php в строке 8

Почему эта ошибка не перехватывается вторым уловом?

4

Решение

Как упомянутый пользователь 2782001 это не ошибка в глазах разработчиков PHP. Они даже отметили, что ошибки такого типа следует называть «исправимыми»:

мы должны избавиться от любых ссылок на «поддающиеся проверке» фатальные ошибки (если они все еще существуют) в пользу «восстанавливаемых» фатальных ошибок. Использование «catchable» здесь сбивает с толку, так как они не могут быть перехвачены с помощью блоков catch.

На Страница руководства ErrorException есть аккуратный обходной путь, преобразующий эти «подхватываемые / восстанавливаемые» ошибки в ErrorException.

<?php
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
// This error code is not included in error_reporting
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");
?>

теперь вы сможете отследить эти ошибки с помощью:

<?php
try {
// Error code
} catch (Error $e) { // this will catch only Errors
echo $e->getMessage();
}
?>

или же

try {
// Error code
} catch (Throwable $t) { // this will catch both Errors and Exceptions
echo $t->getMessage();
}
?>
1

Другие решения

Кто-то сообщил об этом как об ошибке разработчикам PHP, которые быстро решили, что это не ошибка. https://bugs.php.net/bug.php?id=72948&править = 3

Этот случай был намеренно опущен … (на практике вы можете просто преобразовать восстанавливаемый фатальный код в исключение, используя обработчик ошибок …)

Таким образом, вы все еще должны использовать

set_error_handler ()

функция, которую мы все надеялись оставить позади. Разработчики PHP настолько хороши, что никогда не оставляют ваш день слишком солнечным …

0

Там могут быть некоторые фатальные ошибки, которые даже не замечены set_error_handler() или же \Throwable,

Приведенная ниже реализация будет ловить ошибки, которые даже не обнаруживаются \Throwable как проверено в php 7.1. Он должен быть реализован только в вашей среде разработки (просто добавив его в конфигурационный файл разработки) и не должен выполняться в рабочей среде.

Реализация

register_shutdown_function(function () {
$err = error_get_last();
if (! is_null($err)) {
print 'Error#'.$err['message'].'<br>';
print 'Line#'.$err['line'].'<br>';
print 'File#'.$err['file'].'<br>';
}
});

Пример ошибки

Error# Class Path/To/MyService contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Path/To/MyServiceInterface::add)
Line# 12
File# Path/To/MyService.php
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector