php扩展内置异常处理类的例子

发布时间:2019-08-31编辑:脚本学堂
本文介绍了php编程中扩展内置的异常处理类的方法,可以用自定义的异常处理类来扩展php内置的异常处理类,一起学习下。

在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象。
虽然在php中提供的内置异常处理类exception,已经具有非常不错的特性,但在某些情况下,可能还要扩展这个类来得到更多的功能。
可以用自定义的异常处理类来扩展php内置的异常处理类。

例子,在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的:
 

复制代码 代码示例:
<?php
class exception{
protected $message = 'unknown exception'; //异常信息
protected $code = 0; //用户自定义异常代码
protected $file; //发生异常的文件名
protected $line; //发生异常的代码行号
 
function __construct($message =null,$code=0){}
final function getmessage(){} //返回异常信息
final function getcode(){} //返回异常代码
final function getfile(){} //返回发生异常的文件名
final function getline(){} //返回发生异常的代码行号
final function gettrace(){} //backtrace()数组
final function gettraceasstring(){} //已格式化成字符串的gettrace()信息
 
//可重载的方法,可输出字符串
function __tostring(){}
}
?>
 

从上代码只为说明内置异常处理函数类exception的结构,它并不是一段有实际意义的可用代码。
如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类exception的子类,非exception类的子类是不能作为异常处理类使用的。

如果在扩展内置异常处理类excepiton时重新定义构造函数,建议同时调用parent::construct()来检查所有的变量是否已被赋值。
当对象要输出字符串的时候,可以重载__tostring()并自定义输出的样式。
可以在自定义的子类中,直接使用内置异常处理exception类中的所有成员属性,但不能重新改写从该父类中继承过来的成员方法,因为该类的大多数公有方法都是final的。

创建自定义的异常处理程序非常简单,和传统类的声明方式相同,但该类必须是内置异常处理类exception的一个扩展。
当php中发生异常时,可调用自定义异常类中的方法进行处理。
创建一个自定义的myexception类,继承了内置异常处理类exception中的所有属性,并向其添加了自定义的方法。

例子:
 

复制代码 代码示例:
<?php
//滴定仪一个异常处理类,但必须是扩展内异常处理类的子类
class myexception extends exception{
//重定义构造器使第一个参数message变为必须被指定属性
public function __construct($message,$code=0){
//在这里定义一些自己的代码
//建议同时调用parent::construct()来检查所有的变量是否已被赋值
parent::__construct($message,$code);
}
//重写父类方法,自定义字符串输出的样式
public function __tostring(){
return __class__.":[".$this->code."]:".$this->message."<br>";
}
//为这个异常自定义一个处理方法
public function customfunction(){
echo "按自定义的方法处理出现的这个类型的异常<br>";
}
}
 
try{
$error='允许抛出这个错误';
throw new myexception($error); //创建一个自定义异常的处理对象,通过throw语句抛出
echo 'never executed'; //从这里开始,try代码块内的代码将不会再被执行
}catch(myexception $e){ //捕获自定义的异常对象
echo '捕获异常:'.$e; //输出捕获的异常消息
$e->customfunction(); //通过自定义的异常对象中的方法处理异常
}
 
echo '你好呀'; //程序没有崩溃继续向下执行
?>
 

在自定义的myexcepition类中,使用父类中的构造方法检查所有的变量是否已被赋值。
而且重载了父类中的__tostring()方法,输出自己定制捕获的异常处理类,在使用上没有多大区别,只不过在自定义的异常处理类中,可以调用为具体的异常专门编写的处理方法。