除了可以实例化并传递Exception基类的实例外,还可以传递任何希望的对象。在大多数情况下,可以扩展Exception类来创建自己的异常类。
我们可以在throw子句中传递任何其他对象。如果在使用特定对象时出现问题,并且希望将其用于调试用途,可以传递其他对象。
然而,在大多数情况下,我们可以扩展Exception基类。PHP手册提供了显示Exception类结构的代码。这段代码如程序清单7-2所示,也可以在http://us.php.net/manual/en/language.oop5.php位置找到。请注意,这并不是真正的代码,它只表示你可能希望继承的代码。
程序清单7-2 Exception类——这是你可能希望继承的代码
<?php
class Exception{
function__construct(string$message=NULL,int$code=0){
if(func_num_args){
$this->message=$message;
}
$this->code=$code;
$this->file=__FILE__;//of throw clause
$this->line=__LINE__;//of throw clause
$this->trace=debug_backtrace;
$this->string=StringFormat($this);
}
protected$message="Unknown exception";//exception message
protected$code=0;//user defined exception code
protected$file;//source filename of exception
protected$line;//source line of exception
private$trace;//backtrace of exception
private$string;//internal only!!
final function getMessage{
return$this->message;
}
final function getCode{
return$this->code;
}
final function getFile{
return$this->file;
}
final function getTrace{
return$this->trace;
}
final function getTraceAsString{
return self::TraceFormat($this);
}
function_toString{
return$this->string;
}
static private function StringFormat(Exception$exception){
//...a function not available in PHP scripts
//that returns all relevant information as a string
}
static private function TraceFormat(Exception$exception){
//...a function not available in PHP scripts
//that returns the backtrace as a string
}
}
?>
这里给出该类定义的主要原因是希望读者注意到该类的大多数公有方法都是final的:这就意味着不能重载这些方法。我们可以创建自己的Exception子类,但是不能改变这些基本方法的行为。请注意,_toString函数可以重载,因此我们可以改变异常的显示方式。也可以添加自己的方法。
用户自定义的Exception类示例如程序清单7-3所示。
程序清单7-3 user_defined_exception.php——用户定义Exception类的示例
<?php
class myException extends Exception
{
function__toString
{
return"<table border=/"1/">
<tr>
<td><strong>Exception".$this->getCode."
</strong>:".$this->getMessage."<br/>"."
in".$this->getFile."on line".$this->getLine."
</td>
</tr>
</table><br/>";
}
}
try
{
throw new myException("A terrible error has occurred",42);
}
catch(myException$m)
{
echo$m;
}
?>
在以上代码中,我们声明了一个新的异常类myException,该类扩展了Exception基类。该类与Exception类之间的差异在于重载了_toString方法,从而为打印异常提供了一个更好的方法。执行以上代码的输出结果如图7-2所示。
图 7-2 myException类为异常提供更好的“打印”格式这个示例非常简单。在下一节中,我们将介绍创建能够处理不同类型错误的不同异常。