php捕获致命错误

记录php错误日志可以有力的帮我们查找问题、修复bug,
php提供了set_error_handler、set_exception_handler来捕获错误和异常。

但是set_error_handler并不能捕获E_ERROR、 E_PARSE、 E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING、E_STRICT等错误。一般来讲,如果是致命错误,会导致php解释器都无法编译通过,自然不能捕获这些错误,但是,我们可以通过一些方法来巧妙的得到这些错误信息。

异常或错误被set_exception_handler set_error_handler try catch 等捕获后,就不会在进入error_log.log日志。

在这里插入图片描述

error_reporting(0);
// ob_start();
function errorHandler($e){
    echo "<pre>";
    echo '这是一个错误';
    print_r($e['code']);
    print_r($e['file']);
    print_r($e['line']);
    throw  $e;

}
function errorHandler2($e){
    echo "<pre>";
    echo '这是一个错误2';
    print_r($e['code']);
    print_r($e['file']);
    print_r($e['line']);
    throw  $e;

}

function exceptionHandler(Exception $e){
    echo '这是一个异常';
    echo "<pre>";
    print_r($e->getTraceAsString());
    // throw  $e;
}

function close(){
    // ob_end_clean();
    $error = error_get_last();
    echo "<pre>";
    print_r($error['code']);
    print_r($error['file']);
    print_r($error['line']);
}
function close2(){
    // ob_end_clean();
    $error = error_get_last();
    echo "<pre>";
    print_r($error['code']);
    print_r($error['file']);
    print_r($error['line']);
}
//设置捕获错误。 捕获后不再向上抛出。 error_get_last 为空
set_error_handler('errorHandler');
// set_error_handler('errorHandler2');
//设置捕获异常。 捕获后 后边不会再有异常输出。也无法再次获取异常 。 除非 在函数中再次抛出异常  throw  $e; 也不会记录到异常日志
set_exception_handler('exceptionHandler');
//设置程序结束时的函数。只是获取信息 不影响错误 记录到日志。 可以设置多个
register_shutdown_function( 'close' );
register_shutdown_function( 'close2' );
//错误
// echo 0/0;
echo $a['dd'];
die;

E_Error 通过set_error_handler 无法捕获。 需要用register_shutdown_function配合 error_get_last获取错误信息。
在这里插入图片描述
在这里插入图片描述

try{
    throw  new Exception('xxx');
}catch (Exception $e){

    // throw  $e;
}
set_error_handler('handlErr');
 register_shutdown_function('err');
function err(){
    var_dump(error_get_last());
}

function handlErr($msg,$code,$file,$line,$content){
    var_dump($msg);
    var_dump($code);
    var_dump($file);
    var_dump($line);

    // var_dump(error_get_last());
}
// var_dump($a['xx']);
//   echo 4/$a;
// echo 'end';
//var_dump(new qq());
try{
    var_dump(new qq());
}catch (Error $e){

    // throw  $e;
}

echo 'success';

版权声明:本文为come11234原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。