- 配置指令
- 错误日志
异常处理
- 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()得到本次执行产生的所有错误。