未抛出PHP7中的错误

未抛出PHP7中的错误,php,error-handling,throwable,Php,Error Handling,Throwable,据我所知,per,PHP7中的错误现在应该被抛出。但在我自己的测试中,情况似乎并非如此: <?php error_reporting(E_ALL); try { echo $a[4]; } catch (Throwable $e) { echo "caught\n"; } echo "all done!\n"; 我误解了什么吗?异常只针对某些类型的错误抛出,这些错误以前会停止执行(E\u RECOVERABLE\u ERROR)。警告和通知不会停止执行,因此不会引发

据我所知,per,PHP7中的错误现在应该被抛出。但在我自己的测试中,情况似乎并非如此:

<?php

error_reporting(E_ALL);

try {
    echo $a[4];
} catch (Throwable $e) {
    echo "caught\n";
}

echo "all done!\n";

我误解了什么吗?

异常只针对某些类型的错误抛出,这些错误以前会停止执行(
E\u RECOVERABLE\u ERROR
)。警告和通知不会停止执行,因此不会引发异常(为此找到了一个异常)

您必须定义一个异常并在那里抛出异常。PHP通知不是例外,因此不会通过
try/catch
块捕获它们

set_error_handler('custom_error_handler');

function custom_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}

try {
    echo $a[4];
} catch (ErrorException $e) {
    echo $e->getMessage().PHP_EOL;
}

echo "all done!\n";

自PHP5.0以来,这一直是一个选项,但是文档(链接到上面)说“不是通过PHP5使用的传统错误报告机制报告错误,而是通过抛出错误异常来报告大多数错误”因此,基于这一点,听起来我不应该这样做。异常只针对某些类型的错误抛出,这些错误以前会停止执行(
E\u RECOVERABLE\u ERROR
)。警告和通知不会停止执行,因此不会引发异常。
set_error_handler('custom_error_handler');

function custom_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}

try {
    echo $a[4];
} catch (ErrorException $e) {
    echo $e->getMessage().PHP_EOL;
}

echo "all done!\n";