BPM-第八章-错误和异常处理

  • 配置指令
  • 错误日志

异常处理

  • php的基本异常类:提供了一个不带参数的默认构造函数;一个带有两个可选参数的重载构造函数;6个方法。
Fatal Error:致命错误(脚本终止运行)
        E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
        E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
        E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
        E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)

    Parse Error:编译时解析错误,语法错误(脚本终止运行)
        E_PARSE  //编译时的语法解析错误

    Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
        E_WARNING         // 运行时警告 (非致命错误)。
        E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
        E_COMPILE_WARNING // 编译警告
        E_USER_WARNING    // 用户产生的警告信息

    Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
        E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
        E_USER_NOTICE // 用户产生的通知信息。

错误和异常

  • 异常:非编译和语法上的错误
  • 错误:属于php脚本本身的错误。warning, notice都是错误,错误不能被try-catch捕获
  • 在php中,任何自身的错误或者非正常的代码都会被当作错误对待,并且不会以异常的形式抛出。
  • 框架都涉及三个函数:register_shutdonw_function, set_error_handler, set_exception_handler
  • 错误的级别:fatal error, parse error, warrning error, notice error
  • 在PHP中,所有异常都需要自己抛出。下面的代码中,会产生一个warring错误,但是不能被捕获。需要手动抛出。
<?php
    $num = 0;
    try {
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();
    }
?>

<?php
    $num = 0;
    try {
        if($num == 0){
        throw new Exception('除数不能为0', 1);
        }
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();
    }
?>
  • PHP中对于异常机制的使用,主要用于业务逻辑判断上面,当业务逻辑不正常时,进行特殊处理。使用set_error_handler()函数进行错误处理。在下面的例子中,发生了错误,进入处理函数handle。
<?php
$a = 0;
function handle($errno,$errstr,$errfile,$errline){
    echo $errfile;
}
set_error_handler('handle');
 
echo 4/$a;
echo PHP_EOL;
echo 'hehe';
?>
  • 异常:出现正常逻辑之外的情况--需要主动抛出;错误:运行时错误(未定义变量)--程序终止运行。
  • 异常的处理方式是使用try{}catch{}捕获主动抛出的异常。
<?php
    try{
        throw new Exception("kkkkkkkkkkkkkkkk");
    }
    catch(Exception $e){
        echo $e->getMessage(),"</br>",$e->getTraceAsString();
    }
?>
  • 使用set_exception_handler()设置异常处理函数。在这种情况下,即使没有try-catch语句,throw抛出的异常也能由set_exception_handler设置的函数自动捕获。
<?php   
    set_exception_handler('exceptionHandler');
    throw new Exception("kkkkkkkkkkkkkkkk");
    function exceptionHandler(Exception $exception){
        echo $exception->getMessage();
    }
?>
  • 通常在出错的时候,php会输出错误信息来帮助调试,这个消息的输出可以使用error_reporting()控制。
error_reporting(E_ALL);
error_reporting(E_ALL!&E_WARRING)
  • 用户自定义错误。使用trigger_error()函数。能够产生一个自定义的错误类型,主动抛出错误。
<?php   
    set_error_handler('errorHandler');
    trigger_error("aaaaaaassssssssssss",E_USER_ERROR);
    function errorHandler($errno,$errstr){
        if($errno==E_USER_ERROR){
            echo "innnnnnnni:",$errstr;
        }
    }
?>
  • 使用set_error_handler()函数指定处理错误的函数。

  • set_error_handler()函数不能处理以下级别的错误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,set_error_handler() 函数所在文件中产生的E_STRICT
  • set_error_handler() 该函数只能捕获系统产生的一些Warning、Notice级别的错误

  • register_shutdown_function()
  • 捕获Fatal Error, Parse Error等错误。set_error_handler()只能处理不会终止脚本运行的错误类型,register_shutdown_function()可以捕获那些会终止脚本运行的错误。

  • register_shutdown_function() 是php脚本执行结束前的最后一个函数,无论是因为错误导致的脚本结束还是正常的结束。借助error_get_last()得到本次执行产生的所有错误。

猜你喜欢

转载自www.cnblogs.com/person3/p/9260364.html
今日推荐