PHP面向对象程序设计(oop)学习笔记(四)-异常处理类Exception
使用异常
PHP5增加了类似其他语言的异常处理模块。在PHP代码中所产生的异常可被throw语句抛出并被catch语句捕获。需要进行异常处理的代码都必须放入到try代码块内,以便捕获可能存在的异常。每个try至少对应一个catch块。使用多个catch可以捕获不同的类所产生的异常。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转到最后一个catch的后面继续执行。当然,PHP允许在catch代码块内再次抛出(throw)异常。
预定义异常Exception
Exception类是所有异常的基类,我们可以通过派生Exception类来达到自定义异常的目的。下面的清单列出了Exception的基本信息。
Exception{
/*属性*/
protectedstring$message; //异常消息内容
protectedint$code; //异常代码
protectedstring$file; //抛出异常的文件名
protectedint$line; //抛出异常在该文件中的行号
/*方法*/
public__construct([string$message=""[,int$code=0[,Exception$previous=NULL]]]) //异常构造函数
finalpublicstringgetMessage(void) //获取异常消息内容
finalpublicExceptiongetPrevious(void) //返回异常链中的前一个异常
finalpublicintgetCode(void) //获取异常代码
finalpublicstringgetFile(void) //获取发生异常的程序文件名称
finalpublicintgetLine(void) //获取发生异常的代码在文件中的行号
finalpublicarraygetTrace(void) //获取异常追踪信息
finalpublicstringgetTraceAsString(void) //获取字符串类型的异常追踪信息
publicstring__toString(void) //将异常对象转换为字符串
finalprivatevoid__clone(void) //异常克隆
}
了解完Exception后,我们来尝试扩展exception类来实现一个自定义异常。
functionconnectToDatabase()
{
if(!$link=mysql_connect("myhost","myuser","mypassw","mybd"))
{
thrownewException("couldnotconnecttothedatabase.");
}
}
try
{
connectToDatabase();
}
catch(Exception$e)
{echo$e->getMessage();
}
这里我们抛出类一个Exception类型的异常,并在catch里捕获了这个异常,最终打印出了“couldnotconnecttothedatabase.”。或许你想还想显示数据库连接失败的原因信息。下面及通过扩展exception类来实现我们的自定义信息。
set_exception_handler设置一个用户定义的异常处理函数 当一个未捕获的异常发生时所调用的函数名称作为set_exception_handler的参数。该函数必须在调用set_exception_handler()之前被定义。该函数接受一个参数,该参数是一个抛出的异常对象。这可以用来改进上边提到的异常记录日志处理。 1.3、PHP允许在catch代码块内再次抛出(throw)异常。 总结 异常的功能非常强大,但是不以为着我们可以在项目中肆意的滥用异常机制,特别是大量使用异常日志的机制,这回大大增加系统系统开销降低应用程序的性能。利用错误代码我们可以方便的对错误信息进行管理,当一个错误信息被多次平抛出时,使用错误代码是科学的选择。我们甚至可以通过错误代码来让错误消息也支持多语言显示。
classMyExceptionextendsException
{
protected$ErrorInfo;
//构造函里处理一些逻辑,然后将一些信息传递给基类
publicfunction__construct($message=null,$code=0)
{
$this->ErrorInfo="自定义错误类的错误信息";
parent::__construct($message,$code);
}
//提供获取自定义类信息的方法
publicfunctionGetErrorInfo()
{
return$this->ErrorInfo;
}
/**
*
*这里还可以添加异常日志,只需在上面的构造函数里调用就可以了
*
*/
publicfunctionlog($file)
{
file_put_contents($fiel,$this->__toString(),FILE_APPEND);
}
}
functionconnectToDatabase()
{
thrownewMyException("ErrorMessage");
}
try
{
connectToDatabase();
}
catch(MyException$e)
{
echo$e->getMessage()."\n";
echo$e->GetErrorInfo();
}
functionExceptionLogger($exception)
{
$file="ExceptionLog.log";
file_put_contents($fiel,$exception->__toString(),FILE_APPEND);
}
set_exception_handler(ExceptionLogger);
try
{
#code...
}
catch(Exception$e)
{
if($e->getCode()==999)
{
#进行一些操作
}
else
{
throw$e;
}
}
相关文章