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

    HTML5的本地存储是大势所趋,如果仅存储在内存中,则是sessionStorage,他们的语法都是一样,仅仅是一个存储在本地文件系统中,另一个存储在内存中(随着浏览器的关闭而消失),其语句如下: l ...

  2. Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据(转)

    hadoop的hdfs文件系统中,默认的是utf-8, 故你上传的文件是要设置成utf-8.当输入的是gbk,有该如何? 输入是GBK文件, 输出也是 GBK 文件的示例代码: Hadoop处理GBK ...

  3. 一、HTML和CSS基础--HTML+CSS基础课程--第4部分

    第七章 CSS的继承.层叠和特殊性 继承:CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代. 特殊性
权值的规则: 标签 ...

  4. php 练习

    下拉样式 <select> <?php $a = array( array("n001 汉族"), array("n002 回族"), arr ...

  5. JS生成某个范围的随机数(四种情况)

    前言: JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random()  这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉 ...

  6. Ubuntu配置java环境变量

    参考文章: http://www.cnblogs.com/BigIdiot/archive/2012/03/26/2417547.html 方法1:修改/etc/profile 文件所有用户的 she ...

  7. hdu 5115 区间dp ***

    题意:有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值. 枚举中间k作为最后杀死的 ...

  8. Android快捷键

    Android快捷键ALT+/ :在布局文件中,提示输入的内容Shift + Ctrl +  / :注释Shift + Ctrl +  \ :解除注释

  9. Android系统自带样式(@android:style/) (转)

    摘自:http://blog.csdn.net/hongya1109110121/article/details/11985545 在AndroidManifest.xml文件的activity中配置 ...

  10. enter键实现自动登录

    将登录窗口的属性acceptbutton更改为登录按钮!