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类来实现我们的自定义信息。
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(); }
set_exception_handler设置一个用户定义的异常处理函数
当一个未捕获的异常发生时所调用的函数名称作为set_exception_handler的参数。该函数必须在调用set_exception_handler()之前被定义。该函数接受一个参数,该参数是一个抛出的异常对象。这可以用来改进上边提到的异常记录日志处理。
functionExceptionLogger($exception) { $file='ExceptionLog.log'; file_put_contents($fiel,$exception->__toString(),FILE_APPEND); } set_exception_handler(ExceptionLogger);
1.3、PHP允许在catch代码块内再次抛出(throw)异常。
try { #code... } catch(Exception$e) { if($e->getCode()==999) { #进行一些操作 } else { throw$e; } }
总结
异常的功能非常强大,但是不以为着我们可以在项目中肆意的滥用异常机制,特别是大量使用异常日志的机制,这回大大增加系统系统开销降低应用程序的性能。利用错误代码我们可以方便的对错误信息进行管理,当一个错误信息被多次平抛出时,使用错误代码是科学的选择。我们甚至可以通过错误代码来让错误消息也支持多语言显示。