php中异常处理方法小结


Posted in PHP onJanuary 09, 2015

本文实例总结了php中异常处理方法。分享给大家供大家参考。具体分析如下:

当异常被触发时,通常会发生:在PHP5中添加了类似于其它语言的错误异常处理模块。在 PHP代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的 catch。

使用多个 catch 可以捕获不同的类所产生的异常,当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常,当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch,如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息.

1、异常类的层级关系,代码如下:

class NotFoundException extends Exception{}
class InputException extends Exception{}
class DBException extends Exception{}

2、配置未捕捉异常的处理器,代码如下:

function exception_uncaught_handler(Exception $e) {    

header('Content-type:text/html; charset=utf-8');    

if ($e instanceof NotFoundException)    

exit($e->getMessage());    

elseif ($e instanceof DBException)    

exit($e->getMessage());    

else    

exit($e->getMessage());    

}    

set_exception_handler('exception_uncaught_handler');

3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器,exception_uncaught_handler()函数处理:
$this->resConn = mysql_connect ($CONFIGS['db_host'], $CONFIGS['db_user'], $CONFIGS['db_pwd']);    

if (false == is_resource($this->resConn))    

throw new DBException('数据库连接失败。'.mysql_error($this->resConn));

4、业务逻辑一瞥:
if (0 != strcmp($curAlbum->interest_id, $it))  
throw new NotFoundException('很抱歉,你所访问的相册不存在');

以上就是PHP自定义异常处理器的具体使用方法.

php实例代码如下:

<?php 

class customException extends Exception 

{ 

public function errorMessage() 

{ 

//error message 

$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() 

.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; 

return $errorMsg; 

} 

} 

 

$email = "someone@example.com"; 

 

try 

 { 

 //check if  

 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) 

  { 

  //throw exception if email is not valid 

  throw new customException($email); 

  } 

 //check for "example" in mail address 

 if(strpos($email, "example") !== FALSE) 

  { 

  throw new Exception("$email is an example e-mail"); 

  }

 } 

 

catch (customException $e) 

 { 

 echo $e->errorMessage(); 

 } 

 

catch(Exception $e) 

 { 

 echo $e->getMessage(); 

 } 

?>

例子解释:上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常.

1.customException() 类是作为旧的 exception 类的一个扩展来创建的,这样它就继承了旧类的所有属性和方法.

2.创建 errorMessage() 函数,如果 e-mail 地址不合法,则该函数返回一个错误消息.

3.执行 "try" 代码块,在第一个条件下,不会抛出异常.

4.由于 e-mail 含有字符串 "example",第二个条件会触发异常.

5."catch" 代码块会捕获异常,并显示恰当的错误消息.

如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常,重新抛出异常,有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理,可以在一个 "catch" 代码块中再次抛出异常,代码如下:

总结:PHP异常的使用方法分三步:

第一步:定义异常类,如果不定义就用系统默认的异常类;

第二步:当出现异常时用 throw 抛出异常,例如 ex1($num2);异常的参数是$num2用该异常的getMessage()获取;

第三步:触发异常,用try子句,当满足条件时  throw new ex1($num);

第四步:catch捕获异常 catch (ex2 $e),相当于实例化一个定义好的异常类ex2为$e;

注意,异常可以定义多个,但是只能触发一个,也就是说只能用catch捕获一个异常.

基本异常类,创建可抛出一个异常的函数:

function num($num){ 

 if ($num>1){//异常抛出条件 

  $msg="数值不能大于1″;//异常提示信息 

  throw new Exception($msg);//抛出异常 

 } 

 echo "数值小于1″; 

} 

//在 "try" 代码块中触发异常 

try { 

 num(3); 

 echo "执行正常"; 

} 

//捕获异常 

catch (Exception $e){ 

 echo "错误信息:".$e->getMessage();//Exception()的系统方法获取异常信息 

 echo "错误文件:".$e->getFile();//Exception()的系统方法获取异常文件名 

 echo "行数:".$e->getLine();//Exception()的系统方法获取异常行数 

} 

//====================================================================== 

echo "<br>========================================================<br>"; 

//扩展基本异常类 

function checkEmail($email){//定义一个可以抛出异常的判断EMAIL合法性的函数 

 if (filter_var($email,FILTER_VALIDATE_EMAIL)==false){ 

  throw new checkEmailException($email);//抛出异常用EMAIL做参数 

 } 

 echo "邮件合法"; 

} 

class checkEmailException extends Exception{//定义扩展异常类 

 public function errormsg(){ 

  $msg="错误原因:".$this->getMessage()."不是一个合法的EMAIL地址!"; 

  $msg.="错误文件名:".$this->getFile(); 

  $msg.="错误行数:".$this->getLine(); 

  echo $msg; 

 } 

} 

$email="email…..@chhua.com"; 

try {//触发异常 

 checkEmail($email); 

} 

//捕获异常 

catch (checkEmailException $e){ 

 $e->errormsg(); 

} 

//==================================多个异常的捕获 

echo "<br>===================================================<br>"; 

class ex1 extends Exception{//定义一个异常类 

 public function msg(){ 

  $msg="错误原因:".$this->getMessage()."大于100<br>"; 

  $msg.="错误文件:".$this->getFile()."<Br>"; 

  $msg.="错误代码:".$this->getCode()."<br>"; 

  $msg.="行数:".$this->getLine()."<br>"; 

  echo $msg; 

 } 

} 

class ex2 extends Exception{//定义一个异常类 

        public function msg(){ 

  $msg="错误原因:".$this->getMessage()."等于100<br>"; 

  $msg.="错误文件:".$this->getFile()."<Br>"; 

  $msg.="行数:".$this->getLine()."<br>"; 

  echo $msg; 

 } 

} 

$num2=100; 

try { 

 if ($num2>100){//当条件满足时触发 

  throw new ex1($num2); 

 } 

 if ($num2==100){//当条件满足时触发 

  throw new ex2($num2); 

 }

} 

catch (ex2 $e){//捕获触发的异常 

 $e->msg(); 

} 

catch (ex1 $e){//捕获触发的异常 

 $e->msg(); 

}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
javascript 小型动画组件与实现代码
Jun 02 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
浅析PHP文件下载原理
Dec 25 PHP
PHP查询快递信息的方法
Mar 07 PHP
php文件缓存类用法实例分析
Apr 22 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
php实现图片按比例截取的方法
Feb 06 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP基本语法
Mar 31 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 #PHP
php模拟登陆的实现方法分析
Jan 09 #PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 #PHP
php实现读取手机客户端浏览器的类
Jan 09 #PHP
ucenter通信原理分析
Jan 09 #PHP
PHP上传文件时自动分配路径的方法
Jan 09 #PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 #PHP
You might like
PHP4.04简明安装
2006/10/09 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python生成随机MAC地址
2015/03/10 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python调用java的jar包方法
2018/12/15 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
工作中个人的自我评价
2013/12/31 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server