错误处理:
//echo date(); //warning 警告,其他正常程序的页面正常显示 //echo dat(); //Fatal error 致命错误 出错处及后面的程序都不执行 //echo date() //Parse error 语法错误 整个页面都将终止 //echo $str; //Notice 注意 其他正常程序的页面正常显示
一.配置指令
PHP 中与错误有关的配置指令确定了语言的错误处理行为
1.设置错误敏感级别
有两种方式,可以设置错误敏感级别,一个是修改 php.ini 文件,重启后生效。一个是 使用 error_reporting 函数在项目中设置。
php.ini 的设置方法就是修改:error_reporting = E_ALL&~E_NOTICE ,改成你要设 置的错误级别,重启方可生效。
PS:这种改法会让服务器所有的项目都生效,会影响所有 的项目,导致不必要的麻烦,并且虚拟主机一般不会让你碰 php.ini 的。
项目中设置,使用error_reporting()函数:error_reporting(E_ALL & ~E_NOTICE);这样 就可以设置你想要的错误级别了。
PS:在开发阶段,我们可以设置将所有错误信息输出,严格按照规范来编写代码。当 项目测试完毕,基本没有错误了。可以设置屏蔽所有错误信息输出,以提供优良的用户体验。
ini_set('display_errors','off')这个方法,可以屏蔽所有的错误输出。
二.错误日志
将项目中错误的信息写到一个文件中去。
为了运行阶段的用户体验,我们可以屏蔽错误的显示。但如果这样,维护人员就无法得 到网站运行的错误消息了,这个时候,我们有必要讲错误写入日志。
要将错误写入日志,需要如下几个步骤:
1.开启错误日志功能:ini_set('log_errors','on');
2.关闭错误显示功能:ini_set('display_errors','off');
3.设置错误报告级别:error_reporting(E_ALL);
4.设置错误日志目录:ini_set('error_log','error.log');
错误日志做法:
//为了让用户得到更好的体验,我们屏蔽了所有错误的输出,PS:是输出,而不是显示 //这样的话,管理员也看不到错误了。 //页面上不显示错误,而将错误生成一个日志,提供给管理员查看。 //error_reporting(~E_ALL)讲所有输出都屏蔽掉了,自然,管理员也看不到了 //我不要屏蔽所有输出,我只要屏蔽所有显示 //ini_set('display_errors','off');表示屏蔽了所有的页面上错误的显示,但没有屏蔽错误的输出 ini_set('log_errors','on'); //开启日志写入功能 ini_set('display_errors','off'); //屏蔽页面显示 error_reporting(E_ALL); //输出所有错误 ini_set('error_log','myerror.log'); //日志的存放位置 //echo date(); //1.warning 警告,其他正常程序的页面正常显示 //echo dat(); //2.Fatal error 致命错误 出错处及后面的程序都不执行 //echo $str; //3.Notice 注意 其他正常程序的页面正常显示 //注意:写入错误日志不能有语法错误
三.异常处理
所谓异常,就是在程序运行过程中发生了意外而产生的错误。比如,服务器断电,电脑 断网之类导致程序无法连接。这种情况,我们称做异常,它不是错误。 而异常处理应该遵循一下几个步骤:
1.尝试着执行某个可能会产生异常的语句;
2.如果尝试执行失败,则抛出一个异常;
3.捕获该异常;
4.异常处理特性清除在尝试期间占用的资源。
PS:在 PHP 语言里,所有异常都必须自己抛出,而不像 JAVA.NET 之类的语言会自动 抛出异常,这也正是 PHP 源代码里很少看到异常处理语句的原因之一。
先看一个普通的意外处理:
<?php $a = 5; $b = 0; //错误处理的方法 if ($b == 0) { echo '被除数不能为零'; exit(); } echo $a / $b; //异常抛出的方法 try { //PHP没有太多内置的异常对象,所以需要自己抛出 if ($b == 0) throw new Exception(); //如果当b=0的时候,就抛出异常 throw new Exception echo $a / $b; } catch (Exception $e) { echo '被除数不得为零'; } //通过构造方法传参,直接传入错误消息,然后通过getMessage输出 try { if ($b == 0) throw new Exception('被除数不能为零'); echo $a / $b; } catch (Exception $e) { echo $e->getMessage(); } //捕获多个异常 try { if ($b == 0) throw new Exception('被除数不能为零'); if ($b == 1) throw new Exception('被除数不能为1'); if ($b == 2) throw new Exception('被除数不能为2'); echo $a / $b; } catch (Exception $e) { echo $e->getMessage(); } ?>
通过自定义异常类来捕获异常
<?php class ZeroException extends Exception { public function __construct($message = null, $code = 0) { parent::__construct($message,$code); } } ?>
<?php require 'ZeroException.class.php'; $a = 5; $b = 0; try { if ($b == 0) throw new ZeroException('被除数不能为零'); echo $a / $b; } catch (ZeroException $e) { echo $e->getMessage(); } ?>