У меня есть некоторый код обработки ошибок, который пытается удостовериться, что я ловлю и обрабатываю любые проблемы на определенном уровне, поэтому я использовал set_error_handler
для преобразования исправляемых ошибок в исключения, а затем у меня есть перехват для все исключения. Идея состоит в том, что, если код попадает в какую-то исправимую ошибку или выдает исключение, это должно поймать все это. Но я вижу, что происходит повторяющаяся ошибка, которая преобразуется в исключение, а затем не попадает в мою ловушку. Не понимаю почему.
public function catchableFatalErrorCatcher($errno, $errstr) : bool
{
if (error_reporting() !== 0 && $errno === E_RECOVERABLE_ERROR)
{
throw new ParseException($errstr, $errno); //extends \Exception
}
return false;
}
public function evaluate($cmd)
{
$prevErrorHandler = set_error_handler([$this, 'catchableFatalErrorCatcher']);
try
{
$tokens = $this->tokenize($cmd);
$value = $this->parse($tokens, $this->model);
if (is_array($value))
{
// IN THE FAILURE CASE, $value IS AN ARRAY OF OBJECTS AND THIS
// CAUSES AN ERROR BECAUSE THE ELEMENTS CAN'T BE TURNED INTO STRINGS.
$value = implode(', ', $value);
}
return strval($value);
}
catch (ParseException $e)
{
if ($this->trace !== null)
{
$this->trace .= $e->getMessage() . "\n";
}
return '';
}
finally
{
set_error_handler($prevErrorHandler);
}
}
Я получаю ошибку HTTP 500 на моем сайте, и в моем журнале ошибок php появляется сообщение: PHP Warning: Uncaught <<redacted>>\ParseException: Object of class <<redacted>> could not be converted to string
. Трассировка стека ясно показывает, что вызывается обработчик ошибок из-за вызова implode, который я отмечал выше. Как это не быть пойманным??