PHP异常类及异常处理操作实例详解


Posted in PHP onDecember 19, 2018

本文实例讲述了PHP异常类及异常处理操作。分享给大家供大家参考,具体如下:

异常处理归类于错误处理,PHP从5.1.0开始增加了Exception异常处理类。

一、异常处理

PHP 异常处理与Java相似,都使用try、throw、catch语句,发生异常时代码。如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。

1、try:

用于可能发生异常的代码块。

2、throw:

规定如何触发(trigger)异常,用于抛出异常。每一个throw必须对应至少一个catch。

3、catch:

捕获异常,并创建包含异常信息的对象。

说明:姑且认为php的异常必须throw才能捕获到。

基本结构:

try{
#some codes
throw new Exception("message"[,code[,...]]);
}
catch(Exception $ex){
#some codes
}

二、PHP 异常基类Exception

类摘要:

Exception {
/* 属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )
final public string getMessage ( void )
final public Exception getPrevious ( void )  //获取异常链中前一个异常
final public int getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )   //获取异常追踪信息
final public string getTraceAsString ( void )  //字符串方式返回异常追踪信息
public string __toString ( void )
final private void __clone ( void )
}

说明:

由该基类可看出,php异常对象主要包含异常的文本信息(message)、异常代码/代号(code,应该是用于开发人员标识)、异常发生的文件(file,即发生异常的php文件)、异常发生的具体位置(line,抛出异常的行号)。

示例:

<?php
try {
 throw new Exception("Some error message", 30);//抛出异常,设置异常代号为30
} catch(Exception $e) {
 echo "Exception:file:".$e->getFile().",message:" . $e->getMessage().",code:".$e->getCode()."line:".$e->getLine();
}
?>

浏览器打印结果:

Exception:file:D:\studyFolder\wamp\workspace\basicphp\testException.php,message:Some error message,code:30line:3

关于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;
 }
 }

抛出与捕获该异常:

try{
throw new customException("这是自定义异常。");
}
catch(customException $ex){
#some codes
}

四、多catch捕获异常

当一个try语句中可能抛出不同的异常时,对应的可有多个catch块捕获不同类型异常。同java中的一些注意点:

1、大异常catch放后面。因为抛出异常时按顺序判断先满足哪个catch,一次仅执行一个catch。

2、执行一次try,最多执行一个catch(发生异常时),即若前面某个catch满足执行,则后面的catch不再考虑。(常见考题)

五、嵌套抛出异常

结构示例:

try{
 try{
  throw new Exception("第一个异常");
 }
 catch(Exception $e1){
  #相关处理
  throw new Exception("处理后抛出异常");//再次抛出异常
 }
}
catch(Exception $e2){
 #相关处理
}

六、设置顶层异常处理器

set_exception_handler('myException'):函数设置所有未捕获的异常的处理函数句柄(函数名,此处即myException)。

示例:

<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

结果:

Exception:Uncaught Exception occurred

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

PHP 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
PHP设计模式 注册表模式
Feb 05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
Dec 18 #PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 #PHP
PHP获取星期几的常用方法小结
Dec 18 #PHP
php往mysql中批量插入数据实例教程
Dec 12 #PHP
yii2 url重写并隐藏index.php方法
Dec 10 #PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 #PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 #PHP
You might like
php绘制一个矩形的方法
2015/01/24 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
非主流的textarea自增长实现js代码
2011/12/20 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
采购部主管岗位职责
2014/01/01 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
生物工程专业求职信
2014/09/03 职场文书
个人总结与自我评价
2014/09/18 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
只用Python就可以制作的简单词云
2021/06/07 Python
关于Python中*args和**kwargs的深入理解
2021/08/07 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
Redis入门基础常用操作命令整理
2022/06/01 Redis