针对不同的异常,进行不同的处理,可以通过自定义异常类记录特定的异常信息来处理不同类型的异常。自定义异常类通过继承基类(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. (十)stm32中FSMC的使用(用于LCD)

    FSMC全称“静态存储器控制器”. 使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线. (1)当存储数据设为8位时, ...

  2. 谈JavaScript代码封装

    前言 也算老生常谈的问题了,再深入搞一搞怎么玩儿封装,如果看到这篇文章的你,正好你也是追求完美的代码洁癖狂者,那么这篇文章相信非常适合你. 举一个例子,编写一个Person类,具有name和birth ...

  3. Android实现高仿QQ附近的人搜索展示

    本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...

  4. linux环境下配置虚拟主机域名

    linux环境下面配置虚拟主机域名 第一步:在root目录下面(即根目录)ls(查看文件)cd进入etc目录find hosts文件vi hosts 打开hosts文件并进行编辑在打开的文件最下面添加 ...

  5. InnoDB引擎的索引和存储结构

    在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的.而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 ...

  6. 对线程调度中Thread.sleep(0)的深入理解

    在Java或者C#中,都会用到 Thread.Sleep()来使线程挂起一段时间.那么你有没有正确的理解这个方法的用法呢?思考下面这两个问题: 1.假设现在是 2014-8-13 17:00:00.0 ...

  7. win32_11gR2_database安装教程

  8. 动态链接库(dll)简介(转)

    DLL 是 Dynamic Link Library 的缩写,译为“动态链接库”.DLL也是一个被编译过的二进制程序,可以被其他程序调用,但与 exe 不同,DLL不能独立运行,必须由其他程序调用载入 ...

  9. HDU 4974 Dracula and Ethan 优先队列

    Dracula and Ethan Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching competition ...

  10. Web测试Selenium:如何选取元素

    Web测试工具Selenium:如何选取元素 2009-02-17 23:23 by 敏捷的水, 5372 阅读, 22 评论, 收藏, 编辑 selenium是一个非常棒的Web测试工具,他对Aja ...