前言:
好的代码,不仅仅要代码设计优美,结构清晰。更要有完善的错误处理机制,特别是针对异常的处理,只有这样才能在系统出现问题的时候,准确排查错误。记住,错误和异常不是一回事,错误是开发阶段的一些失误,引起的程序问题,您只要解决掉错误才能推进程序的开发。异常,则是项目在运行的过程中遇到的一些意外,导致程序运行失败。
错误处理:
错误主要分语法错误,运行时错误,逻辑错误三大种。
- 语法错误: 语法错误最常见,比如遗漏了“}“号,遇到这样的错误,后面的程序就不能继续执行了。
- 运行时错误:这种错误发生在编译时,例如在header()函数前有字符输出,php通常会显示一条错误,但是后面的程序能继续执行。
- 逻辑错误:属于您自身程序逻辑的设计错误,不影响程序执行,但是和您期望的结果会有偏差,比如在jf判断的时候,==判断错写成=。变成了赋值语句,永远返回true。
错误级别:运行php是,php解析器会尽可能的汇报它遇到的错误,这是php解析器的相关功能。如果您不希望php解析器显示错误,可以修改php.ini文件中的display_errors=off。注意,这只是关闭的错误的显示,错误依然存在。主要用于线上环境,您不希望客户看到错误等敏感信息时使用。
php解析器会按照错误发生的严重程度进行汇报,有些错误比较严重,程序会暂停。有些错误则只是警告,会继续执行。您可以通过修改php.ini的error_reporting=E_AAL&~E_NOTICE设置您想看到的错误级别。比如您想看到所以错误,除了警告错误。
1 E_ERROR 致命的运行错误。错误无法恢复,暂停执行脚本。
2 E_WARNING 运行时警告(非致命性错误)。非致命的运行错误,脚本执行不会停止。
4 E_PARSE 编译时解析错误。解析错误只由分析器产生。
8 E_NOTICE 运行时提醒(这些经常是你代码中的bug引起的,也可能是有意的行为造成的。)
16 E_CORE_ERROR PHP 启动时初始化过程中的致命错误。
32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)。
64 E_COMPILE_ERROR 编译时致命性错。这就像由Zend脚本引擎生成了一个E_ERROR。
128 E_COMPILE_WARNING 编译时警告(非致性错)。这就像由Zend脚本引擎生成了E_WARNING警告。
256 E_USER_ERROR 自定义错误消息。像用PHP函数trigger_error(程序员设置E_ERROR)
512 E_USER_WARNING 自定义警告消息。像用PHP函数trigger_error(程序员设的E_WARNING警告)
1024 E_USER_NOTICE 自定义的提醒消息。像由使用PHP函数trigger_error(程序员E_NOTICE集)
2048 E_STRICT 编码标准化警告。允许PHP建议修改代码以确保最佳的互操作性向前兼容性。
4096 E_RECOVERABLE_ERROR 开捕致命错误。像E_ERROR,但可以通过用户定义的处理捕获(又见set_error_handler())
8191 E_ALL 所有的错误和警告(不包括 E_STRICT) (E_STRICT will be part of E_ALL as of PHP 6.0)
16384 E_USER_DEPRECATED
30719 E_ALL
修改错误级别还是比较常用的,每次修改php.ini太麻烦了,所以php提供了error_reporting(0);函数来处理。
例子:
<?php
//开启php.ini中的错误显示
ini_set('display_errors',1);
//错误输出级别-所有错误
error_reporting(E_ALL);
//注意:notice的报告,不会阻止脚本的执行,并且可能不是一个问题。
getType($var);
//警告:warning的报告,不会阻止脚本的执行,但应该是一个问题。
getType();
//错误:error的报告,会阻止脚本的执行
get_type();
?>
您得到的错误如下,可以清楚的看到php是怎样按照错误的级别提交错误的。您可以试试,降error错误放到前面,您会发现后面的错误不会触发了,因为程序终止了!
到目前为止,您看到的错误,都是由于错误的代码,php解析器发现后给您抛出的。那自己要能否抛出这些错误呢?答案是肯定的
<?php
$site = "http://www.w3school.com.cn/";
fopen($site,"r")
or die("Unable to connect to $site");
?>
在上面的代码中,我们通过die来结束代码,并返回字符串提示错误。但是提示的错误信息只是一个字符串,过于简单。
您可以通过trigger_error(error_msg)函数来抛出错误。
<?php
$site = "http://www.w3school.com.cn/";
fopen($site,"r")
or trigger_error("Unable to connect to $site");
?>