针对不同的异常,进行不同的处理,可以通过自定义异常类记录特定的异常信息来处理不同类型的异常。自定义异常类通过继承基类(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 )自定义异常类的更多相关文章

  1. PHP 错误与异常 笔记与总结(10)错误处理器测试

    关联文件:myErrorHandler.php (上一篇) 先测试通知级别的错误的自定义处理: testErrorHandler.php <?php require_once 'myErrorH ...

  2. PHP 错误与异常 笔记与总结(12 )异常

    ① 异常的概念:异常和错误的区别 PHP 部分借鉴了 C++ 和 JAVA 中的异常处理机制.PHP 中的异常是指 程序运行和预期不太一致,与错误是两个不同的概念. ② 异常的语法结构 [例1] &l ...

  3. PHP 错误与异常 笔记与总结(17 )像处理异常一样处理 PHP 错误

    有两种方式可以在 PHP 中以异常的方式处理错误: ① PHP 内置的 ErrorException类(也是 Exception 类的子类) <?php function exception_e ...

  4. PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息

    使异常处理变得更灵活.可观察,可以使用设计模式中的观察者模式. 文件 ① 定义观察者的接口 ExceptionObserver.php: <?php /* 给观察者定义的规范 */ interf ...

  5. Java -- 异常的捕获及处理 -- 自定义异常类

    7.4 自定义异常类 定义异常类只需要继承Exception类即可. 例:自定义异常类 Class : MyException package limeThrowable._7_4; public c ...

  6. PHP 错误与异常 笔记与总结(18 )页面重定向实现

    在发生错误时,将用户重定向到另一个页面. <?php header('content-type:text/html; charset=utf-8'); class ExceptionRedire ...

  7. PHP 错误与异常 笔记与总结(14 )记录和发送异常信息

    当发生异常时,把异常信息记录到日志文件中: <?php header('content-type:text/html; charset=utf-8'); class LogException e ...

  8. PHP 错误与异常 笔记与总结(5)配置文件中与错误日志相关的选项 && 将错误记录到指定的文件中

    [记录错误(生产环境)] php.ini: ① 开启 / 关闭 错误日志功能 log_errors = On ② 设置 log_errors 的最大字节数 log_errors_max_len = 其 ...

  9. PHP 错误与异常 笔记与总结(4)通过 trigger_error 触发 PHP 错误

    [错误抑制符@] 除了 php.ini 中 error_reporting 和 display_errors 的设置.error_reporting() 函数.ini_set() 函数 外,还可以使用 ...

随机推荐

  1. 【读书笔记】读《JavaScript设计模式》之工厂模式

    一个类或对象中往往会包含别的对象.在创建这种成员对象时,你可能习惯于使用常规方式,也即用new关键字和类构造函数.问题在于这回导致相关的两个类之间产生依赖性. 工厂模式用于消除这两个类之间的依赖性,它 ...

  2. Android拼图游戏

    效果如下 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准 ...

  3. Android 4.0 事件输入(Event Input)系统

    参考:http://blog.csdn.net/myarrow/article/details/7091061 1. TouchScreen功能在Android4.0下不工作 原来在Android2. ...

  4. Vim折叠模式设置

    参考文章:http://www.cnblogs.com/welkinwalker/archive/2011/05/30/2063587.html set foldmethod=indent " ...

  5. JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)

    package com.itcast.test20140113; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  6. loj 1034(最小点基)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25911 思路:强连通缩点,在新图中找入度为0的点的个数即可. #i ...

  7. SQL脚本--有关压缩数据库日志

    /*--压缩数据库的通用存储过程  压缩日志及数据库文件大小 因为要对数据库进行分离处理 所以存储过程不能创建在被压缩的数据库中 --邹建 2004.03(引用请保留此信息)--*/ /*--调用示例 ...

  8. QUnit使用笔记-1判断方法

    QUnit是一个前端测试工具. 判断效果: html基本结构: <h1 id="qunit-header">QUnit</h1> <h2 id=&qu ...

  9. BZOJ3495 : PA2010 Riddle

    2-SAT. 建立n个变量,其中第i个变量表示第i个城市是否是首都. 对于边(x,y),连边x->y',y->x'. 对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城 ...

  10. CSS3 box-shadow快速教程

    box-shadow 属性向框添加一个或多个阴影.这个CSS3的属性很常用,盒阴影.按钮状态等各种地方都有用到,但是你了解并记住各个参数的作用及用法吗? 展示 源码:http://codepen.io ...