Обработчик ошибок PHP, генерирующий исключения, которые не перехватываются - PullRequest
0 голосов
/ 14 мая 2019

У меня есть некоторый код обработки ошибок, который пытается удостовериться, что я ловлю и обрабатываю любые проблемы на определенном уровне, поэтому я использовал 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, который я отмечал выше. Как это не быть пойманным??

1 Ответ

0 голосов
/ 14 мая 2019
## Please Use Below code
public function catchableFatalErrorCatcher($errno, $errstr) : bool
{
    if (error_reporting() !== 0 && $errno === E_RECOVERABLE_ERROR)
    {
        throw new Exception($errstr, $errno);
    }
    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 (Exception  $e)
    {
        if ($this->trace !== null)
        {
            $this->trace .= $e->getMessage() . "\n";
        }
        return '';
    }
    finally
    {
        set_error_handler($prevErrorHandler);
    }
}
...