将心比心,方得人心~

错误与异常处理

周洲 2017-04-06 20:53:07

错误处理:

//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();
}
?>

打赏

『微信打赏』

Tag标签php 

我是有底线的