针对不同的异常,进行不同的处理,可以通过自定义异常类记录特定的异常信息来处理不同类型的异常。自定义异常类通过继承基类(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. cVim—Chrome上更强大的vim插件

    cVim——Chrome上更强大的vim插件 介绍 也许很多人在chrome上都用过类似Vimium, ViChrome的插件,这些插件的目的都差不多,就是在浏览器中提供一些类似vim的操作来提高效率 ...

  2. 6.原型模式(Prototype Pattern)

    using System; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // 孙 ...

  3. Stringbuffer与Stringbuilder源码学习和对比

    >>String/StringBuffer/StringBuilder的异同 (1)相同点观察源码会发现,三个类都是被final修饰的,是不可被继承的.(2)不同点String的对象是不可 ...

  4. UVa 11995:I Can Guess the Data Structure!(数据结构练习)

    I Can Guess the Data Structure! There is a bag-like data structure, supporting two operations: 1 x T ...

  5. Mac下Erlang环境安装

    下载源码(地址:http://www.erlang.org/download.html),  传统的三步安装: ./configure ./make sudo make install 备注:在编译系 ...

  6. hdu 5312 数学

  7. H5开发之Eclipes 编码乱码问题

    1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...

  8. Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

    Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4  函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部 ...

  9. C# 中的可变参数方法(VarArgs)

    首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...

  10. ural 1244. Gentlemen

    1244. Gentlemen Time limit: 0.5 secondMemory limit: 64 MB Let's remember one old joke: Once a gentle ...