php错误异常处理
一.错误处理
在运行php脚本时,PHP解析器会尽可能的去报告他所遇到的问题。在php中,错误报告的处理行为都是通过php的配置文件php.ini有关的配置指令确定的
在php中错误是分级别的,如下:
E_ERROR 致命的运行时错误,一旦发生阻止脚本的运行
E_WARNING 运行时警告(非致命的错误)
E_PARSE 语法解析错误
E_NOTICE 注意消息(可能有问题也可能没有问题)
E_CORE_ERROR 类似EE_ERROR,但是不包括php核心造成的错误
E_CORE_WARNING 类似E_WARNING,但是不包括php核心造成的错误
E_COMPILE_ERROR 致命的编译错误
E_COMPILE_WARNING 致命的编译警告
E_USER_ERROR 用户导致的错误信息
E_USER_WARNING 用户导致的警告
E_USER_NOTICE 用户导致的注意消息
E_ALL 所有的错误所有的警告
E_STRICT 有关php版本移植的兼容行性和操作性建议。
1.设置是否出错时,输出错误信息
设置php.ini中的diplay_errors:On 输出错误信息; display_errors:Off 不输出错误信息。 一般而言,php.ini文 件中初始化设置是输出错误。当然我们还可以在单个脚本文件中允许是否输出错误信息,通过函数ini_set(), ini_set('display_errors',1)表示输出错误信息;ini_set('display_errors',0)表示不允许输出错误信息。
还可细致的设置那些级别的错误可以输出错误信息。通过设置php.ini文件的中error_reporting ,设置时可以使用 & | ~ 与或非符号。 如:error_reporting=E_ALL&~E_NOTICE 表示允许抛出任何除注意以外的错误信息。其 他的以此类推。当然也可以在单个脚本中通过函数error_reporting()动态设置,如:error_reporting()
所以与在
error_reporting(E_ALL ^ E_NOTICE);表示允许抛出任何除注意以外的错误信息
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
2.自定义错误处理
自定义错误处理的方法是绕过标准php错误处理函数,调用自己定义的函数。通常使用set_error_handle()函数设 置用户自定义的错误处理函数,该函数用于创建程序运行时,使用自己的错误处理方法,失败返回null 。该函数 有两个参数。第一个为必选,为一个回调函数,即用户自定义的错误处理函数
这个函数必须包括四个参数:错误,错误信息,错误文件,错误行号。第二个参数为可选,规定那个级别的错 误,会显示用户定义的错误,默认为E_ALL。所以我们首先需要自定义一个函数,标准格式如下:
function error_handle($error_level,$error_message,$file,$line)
{
$EXIT=false;
switch($error_level)
{
case E_NOTICE:
$error_type='notice';
$EXIT=TRUE;break;
default :
$error_type="unkonw";
}
if($error_type==='notice')
{
print('notice 而已嘛,小意思啦!问题'.$error_message.'发生在'.$file.'文件中的第'.$line.'行');
if($EXIT)die();
}
else
{
echo '没有问题<br />';
}
}
set_error_handler('error_handle');
echo $t;
echo"继续运行!";
3.写错误日志
一旦我们的作品投入使用,就必须得关闭错误信息输出。但是任何产品都会存在意想不到的错误,特别是在交付后的运行中
所以我么需要将一些错误信息写在日志中,便于后期程序员的查看。
使用自己指定的文件记录错误日志,就一定要确保这个文件存放在文档的根目录之外,以防攻击。
指定文件为错误记录的日志,需要配置php.ini文件:
error_reporting=E_ALL ;报告所有的错误类型
diaplay_errors=Off ;不输出错误信息
log_errors=On ;决定日志语句记录的位置
log_errors_max_len=1024 ;每个日志项的长度
error_log='文件路径' ;日志文件的路径
如果我们使用了自定义错误处理函数,要是没有将错误信息写入日志中,那么php系统是不会自动将错误写入日 志中的。如果需要,处理函数中还需要自己将错误写入日志中。
还可以通过error_log()发送一个用户自定义的错误信息。
bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
二.异常处理
通java和c++语言一样是通过try catch语句来捕获异常和处理
注意一个try至少有一个关联的catch,也就是说try可以关联多个catch
在php中Exception是所有异常类的基类,通过php中的异常类我们也可以通过继承的方式,定义我们自己的异常类。