zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP面向对象程序设计(oop)学习笔记(四)-异常处理类Exception

PHP笔记异常学习 处理 面向对象 程序设计 Exception
2023-06-13 09:15:28 时间

使用异常

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;
   }
}

总结

异常的功能非常强大,但是不以为着我们可以在项目中肆意的滥用异常机制,特别是大量使用异常日志的机制,这回大大增加系统系统开销降低应用程序的性能。利用错误代码我们可以方便的对错误信息进行管理,当一个错误信息被多次平抛出时,使用错误代码是科学的选择。我们甚至可以通过错误代码来让错误消息也支持多语言显示。