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

 更新时间:2014年06月12日 10:24:25   投稿:hebedich  
异常经常被用来处理一些在程序正常执行中遇到的各种类型的错误。比如做数据库链接时,你就要处理数据库连接失败的情况。使用异常可以提高我们程序的容错特性,从而使我们的应用程序更加的稳定和健壮。

使用异常

PHP5 增加了类似其他语言的异常处理模块。在PHP代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入到 try 代码块内,以便捕获可能存在的异常。每个try至少对应一个 catch 块。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常。

预定义异常 Exception

Exception 类是所有异常的基类,我们可以通过派生 Exception 类来达到自定义异常的目的。下面的清单列出了 Exception 的基本信息。

复制代码 代码如下:

Exception {
    /* 属性 */
    protected string $message ;        //异常消息内容
    protected int $code ;            //异常代码
    protected string $file ;        //抛出异常的文件名
    protected int $line ;            //抛出异常在该文件中的行号
    /* 方法 */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )    //异常构造函数
    final public string getMessage ( void )            //获取异常消息内容
    final public Exception getPrevious ( void )        //返回异常链中的前一个异常
    final public int getCode ( void )                //获取异常代码
    final public string getFile ( void )            //获取发生异常的程序文件名称
    final public int getLine ( void )                //获取发生异常的代码在文件中的行号
    final public array getTrace ( void )            //获取异常追踪信息
    final public string getTraceAsString ( void )    //获取字符串类型的异常追踪信息
    public string __toString ( void )                //将异常对象转换为字符串
    final private void __clone ( void )                //异常克隆
}

了解完 Exception 后,我们来尝试扩展 exception 类来实现一个自定义异常。

复制代码 代码如下:

function connectToDatabase()
{   
    if(!$link = mysql_connect("myhost","myuser","mypassw","mybd"))
    {
        throw new Exception("could not connect to the database.");
    }
}
try
{
    connectToDatabase();
}
catch(Exception $e)
{echo $e->getMessage();
}

这里我们抛出类一个 Exception 类型的异常,并在catch里捕获了这个异常,最终打印出了“could not connect to the database.”。或许你想还想显示数据库连接失败的原因信息。下面及通过扩展exception类来实现我们的自定义信息。

复制代码 代码如下:

class MyException extends Exception
{
    protected $ErrorInfo;
    //构造函里处理一些逻辑,然后将一些信息传递给基类
    public function __construct($message=null,$code=0)
    {
        $this->ErrorInfo = '自定义错误类的错误信息';
        parent::__construct($message,$code);
    }   
    //提供获取自定义类信息的方法
    public function GetErrorInfo()
    {
        return $this->ErrorInfo;
    }
    /**
     *
     *这里还可以添加异常日志,只需在上面的构造函数里调用就可以了
     *
     */
    public function log($file)
    {
        file_put_contents($fiel,$this->__toString(),FILE_APPEND);
    }
}
function connectToDatabase()
{   
    throw new MyException("ErrorMessage");
}
try
{   
    connectToDatabase();
}
catch(MyException $e)
{   
    echo $e->getMessage() . "\n";
    echo $e->GetErrorInfo();
}

set_exception_handler 设置一个用户定义的异常处理函数

当一个未捕获的异常发生时所调用的函数名称作为set_exception_handler的参数。该函数必须在调用set_exception_handler()之前被定义。该函数接受一个参数,该参数是一个抛出的异常对象。这可以用来改进上边提到的异常记录日志处理。

复制代码 代码如下:

function ExceptionLogger($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;
    }
}

总结

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

相关文章

  • php高清晰度无损图片压缩功能的实现代码

    php高清晰度无损图片压缩功能的实现代码

     经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢?接下来通过本文给大家分享php高清晰度无损图片压缩功能,感兴趣的朋友一起看看吧
    2018-12-12
  • 你可能不知道PHP get_meta_tags()函数

    你可能不知道PHP get_meta_tags()函数

    这篇文章主要介绍了你可能不知道PHP get_meta_tags()函数,比较实用的一个函数了,小编也是第一次看到它,需要的朋友可以参考下
    2014-05-05
  • 利用PHP获取汉字首字母并且分组排序详解

    利用PHP获取汉字首字母并且分组排序详解

    这篇文章主要给大家介绍了关于如何利用PHP获取汉字首字母并且分组排序的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用php具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • php随机输出名人名言的代码

    php随机输出名人名言的代码

    正如你看到的“小谈博客”标题后面的名人名言一样,每刷新一次就会随机出现一条语句,把你喜欢的话放到一起,经常出现在你眼前,给你温暖的力量
    2012-10-10
  • PHP获取本周所有日期或者最近七天所有日期的方法

    PHP获取本周所有日期或者最近七天所有日期的方法

    这篇文章主要介绍了PHP获取本周所有日期或者最近七天所有日期的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 微信公众号开发之文本消息自动回复php代码

    微信公众号开发之文本消息自动回复php代码

    这篇文章主要为大家详细介绍了微信公众号开发之文本消息自动回复php代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • PHP一个简单的无需刷新爬虫

    PHP一个简单的无需刷新爬虫

    今天小编就为大家分享一篇关于PHP一个简单的无需刷新爬虫,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • PHP给文字内容中的关键字进行套红处理

    PHP给文字内容中的关键字进行套红处理

    本文介绍了一个PHP中的函数,可以对内容的关键字进行套红,高亮突出显示关键字,分享给大家,希望对大家有所帮助。
    2016-04-04
  • YiiFramework入门知识点总结(图文教程)

    YiiFramework入门知识点总结(图文教程)

    这篇文章主要介绍了YiiFramework入门知识点,结合图文形式总结分析了YiiFramework创建的具体步骤及使用的相关注意事项,需要的朋友可以参考下
    2015-12-12
  • thinkphp的c方法使用示例

    thinkphp的c方法使用示例

    用过thinkphp的朋友都知道,C()方法在整个框架中用的非常普遍,C方法的实现非常简单,但是功能非常强大,下面是C()方法的详解和使用示例
    2014-02-02

最新评论