PHP 错误与异常 笔记与总结(13 )自定义异常类
针对不同的异常,进行不同的处理,可以通过自定义异常类记录特定的异常信息来处理不同类型的异常。自定义异常类通过继承基类(Exception),对基类进行扩展。
自定义异常类
<?php
header('content-type:text/html; charset=utf-8');
/*
自定义异常类
*/
class MyException extends Exception{
//重写父类构造函数
public function __contruct($message, $code = 0){
parent::__contruct($message, $code);
} //重写 __toString 方法
public function __toString(){
$message = '<h2>出现异常,信息如下:</h2>';
$message .= '<p>'.__CLASS__.' ['.$this->code.']:'.$this->message.'</p>';
return $message;
} //自定义方法
public function test(){
echo 'test.';
} public function stop(){
exit('script end....');
}
} try{
echo '出现异常...';
throw new MyException('测试自定义异常', 3);
}catch(MyException $e){
//输出:测试自定义异常
echo $e->getMessage();
echo '<hr>'; //__toString
echo $e;
echo '<hr>'; //自定义方法test()
echo $e->test();
echo '<hr>'; //自定义方法stop()
echo $e->stop();
echo '<hr>';
} echo 'continue';
输出:
多个 catch 进行捕获
当程序捕获一个个异常时,就不会再进行后面的 catch 分支了,而是直接执行 try{}catch(){} 以后的代码。在捕获多个异常时,应该把基类 Exception 放到最后捕获。例:
<?php
header('content-type:text/html; charset=utf-8');
/*
自定义异常类
*/
class MyException extends Exception{
//重写父类构造函数
public function __contruct($message, $code = 0){
parent::__contruct($message, $code);
} //重写 __toString 方法
public function __toString(){
$message = '<h2>出现异常,信息如下:</h2>';
$message .= '<p>'.__CLASS__.' ['.$this->code.']:'.$this->message.'</p>';
return $message;
} //自定义方法
public function test(){
echo 'test.';
} public function stop(){
exit('script end....');
}
} try{
throw new MyException('测试自定义异常');
}catch(MyException $e){
echo $e->getMessage();
//调用自定义方法test()
$e->test();
echo '<hr>'; //调用自定义方法stop()
$e->stop();
echo '<hr>';
}catch(Exception $e){
echo $e->getMessage();
} echo '<hr>';
echo 'continue';
输出:
【例】自定义 文件写入异常处理类
① 测试 “文件不存在”:
WriteToFile.php
<?php
header('content-type:text/html; charset=utf-8');
/*
自定义文件写入异常类
*/
class FileException extends Exception{
//自定义方法
public function getDetails(){
$code = '错误码['.$this->code.'] ';
switch($this->code){
case 0:
return $code.'没有提供文件';
break;
case 1:
return $code.'文件不存在';
break;
case 2:
return $code.'不是一个文件';
break;
case 3:
return $code.'文件不可写';
break;
case 4:
return $code.'非法的文件操作模式';
break;
case 5:
return $code.'文件写入失败';
break;
case 6:
return $code.'文件不能被关闭';
break;
default:
return $code.'非法';
break;
}
}
} /*
写入文件的类
*/
class WriteData{
private $_message = '';
private $_fp = null; //文件句柄
public function __construct($filename = null, $mode = 'w'){
$this->_message = "文件:{$filename}<br>模式:{$mode}";
if(empty($filename)) throw new FileException($this->_message, 0);
if(!file_exists($filename)) throw new FileException($this->_message, 1);
if(!is_file($filename)) throw new FileException($this->_message, 2);
if(!is_writeable($filename)) throw new FileException($this->_message, 3);
if(!in_array($mode, array('w', 'w+', 'a', 'a+'))) throw new FileException($this->_message, 4);
$this->_fp = fopen($filename, $mode);
}
//写文件
public function write($data){
if(@!fwrite($this->_fp, $data.PHP_EOL)) throw new FileException($this->_message.'数据写入失败', 5);
} //关闭资源句柄
public function close(){
if($this->_fp){
if(@!fclose($this->_fp)) throw new FileException($this->_message.'文件关闭失败', 6);
$this->_fp = null;
}
} //析构方法
public function __destruct(){
$this->close();
}
} //测试
try{
$fp = new WriteData('test.txt', 'w');
$fp->write('测试数据');
$fp->close();
echo '数据写入成功<hr />';
}catch(FileException $e){
echo '<h2>出现异常</h2>',$e->getMessage(),'<br>信息详情:',$e->getDetails();
}
执行结果:
② 测试 “文件不存在”
把 line :75 的
$fp = new WriteData('test.txt', 'w');
改为:
$fp = new WriteData();
执行结果:
③ 在当前目录新建文件 test.txt,执行 php 文件,输出:
文件 test.txt:
PHP 错误与异常 笔记与总结(13 )自定义异常类的更多相关文章
- PHP 错误与异常 笔记与总结(10)错误处理器测试
关联文件:myErrorHandler.php (上一篇) 先测试通知级别的错误的自定义处理: testErrorHandler.php <?php require_once 'myErrorH ...
- PHP 错误与异常 笔记与总结(12 )异常
① 异常的概念:异常和错误的区别 PHP 部分借鉴了 C++ 和 JAVA 中的异常处理机制.PHP 中的异常是指 程序运行和预期不太一致,与错误是两个不同的概念. ② 异常的语法结构 [例1] &l ...
- PHP 错误与异常 笔记与总结(17 )像处理异常一样处理 PHP 错误
有两种方式可以在 PHP 中以异常的方式处理错误: ① PHP 内置的 ErrorException类(也是 Exception 类的子类) <?php function exception_e ...
- PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息
使异常处理变得更灵活.可观察,可以使用设计模式中的观察者模式. 文件 ① 定义观察者的接口 ExceptionObserver.php: <?php /* 给观察者定义的规范 */ interf ...
- Java -- 异常的捕获及处理 -- 自定义异常类
7.4 自定义异常类 定义异常类只需要继承Exception类即可. 例:自定义异常类 Class : MyException package limeThrowable._7_4; public c ...
- PHP 错误与异常 笔记与总结(18 )页面重定向实现
在发生错误时,将用户重定向到另一个页面. <?php header('content-type:text/html; charset=utf-8'); class ExceptionRedire ...
- PHP 错误与异常 笔记与总结(14 )记录和发送异常信息
当发生异常时,把异常信息记录到日志文件中: <?php header('content-type:text/html; charset=utf-8'); class LogException e ...
- PHP 错误与异常 笔记与总结(5)配置文件中与错误日志相关的选项 && 将错误记录到指定的文件中
[记录错误(生产环境)] php.ini: ① 开启 / 关闭 错误日志功能 log_errors = On ② 设置 log_errors 的最大字节数 log_errors_max_len = 其 ...
- PHP 错误与异常 笔记与总结(4)通过 trigger_error 触发 PHP 错误
[错误抑制符@] 除了 php.ini 中 error_reporting 和 display_errors 的设置.error_reporting() 函数.ini_set() 函数 外,还可以使用 ...
随机推荐
- 失恋28天-缝补礼物(codevs 2503)
2503 失恋28天-缝补礼物 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 话说上回他给女孩送 ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
- Cocos2dx开发游戏移植到Android平台
第一步:安装配置安卓SDK,下载NDK并解压,下载cygwin并安装 第二步:导入platform文件夹下,android文件夹下java文件夹 在eclispe的windows--pereferen ...
- jquery easy ui 1.3.4 快速入门(1)
什么是easyui jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复杂 ...
- Oracle数据库表设计时的注意事项
表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与 ...
- zxing实现二维码生成和解析
转自:http://kesun-shy.iteye.com/blog/2154169 二维码的生成与解析.有多种途径.我选择用大品牌,google老大的zxing. gitHub链接是(我用的3.0. ...
- node Later定时任务
var later = require('later'); later.date.localTime(); var basic = {h: [15], m: [40], s: [0]}; var co ...
- Oracle表空间管理
oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE; //修改表空间数据文件类型 2.ALT ...
- poj 1611 The Suspects 并查集
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 30522 Accepted: 14836 De ...
- 枚举GC Roots的实现
枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在很多应用仅仅方 ...