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

   2015-10-13 0
核心提示:异常经常被用来处理一些在程序正常执行中遇到的各种类型的错误。比如做数据库链接时,你就要处理数据库连接失败的情况。使用异常可以提高我们程序的容错特性,从而使我们的应用程序更加的稳定和健壮。

使用异常

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

总结

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

 
标签: Exception
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • ASP.NET中的OutOfMemoryException
    在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下ASP.NET中出现OutOfMemoryException的问题。实际上,在ASP.NET Web服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量。在machine.config配置文
    02-09
  • C++ Boost Exception超详细讲解
    Boost.Exception 库提供了一种新的异常类型 boost::exception,它允许您在抛出异常后将数据添加到异常中。此类型在 boost/exception/exception.hpp 中定义。由于 Boost.Exception 将其类和函数分布在多个头文件中,以下示例访问主头文件 boost/exception/all.
  • Solution for Asp.net Exception about "Unable
    http://www.zu14.cn/Oracle 9.2 Client software requires that you give the Authenticated User privilege to the Oracle Home by following steps:-----------------------------------------------------------------------------------------------1. Lo
    02-09
  • 安装matlab出现UNKNOW EXCEPTION_解决
    近来安装matlab7出现UNKNOW EXCEPTION问题双击“setup.exe”后总是弹出“UNKNOW EXCEPTION”对话框探索与寻觅许久之后。。。终于解决问题。。问题在于你修改了系统默认的临时文件夹。。不是matlab想要的解决方法:在C盘建个TEMP文件夹。。在“我的电脑”属性-
    02-08
  • 使用Sencha Architect进行打包,com.sencha.exc
    因为没有将ruby添加到环境变量中去(D:\Ruby193\bin),然后重启sencha architect-Package-Setup-setup project with cmd-simulate,就会在项目文件夹中的Build中生成打包过的项目
    02-08
  • Flutter 报错[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type ‘_Type‘ is not a su
    Flutter 报错[ERROR:flutter/lib/ui/ui_dart_st
    [ERROR:flutter/lib/ui/ui_dart_state.cc(177] Unhandled Exception: type '_Type' is not a subtype of type 'String' in type cast 报错原因解决办法报错原因在写SharedPreferences工具类时使用泛型失误报错 这个地方不能传入泛型,必须传入T的值,解决办法
    02-08
  • [ERROR:flutter/lib/ui/ui_dart_state.cc(177)]
    解决方案:1.在flutter引入shared_preferences: ^2.0.6 2.Add this code in your MainActivityimport android.content.Contextimport android.os.Bundleimport androidx.annotation.NonNullimport io.flutter.embedding.android.FlutterActivityimport io.f
    02-08
  • ios cannot use "@throw" with objective-c exc
    http://blog.csdn.net/huayu_huayu/article/details/51781182我不转载  我跳转 哈哈哈哈哈哈   其实也就是 解决办法:修改target - build settings - All | Combined - Apple LLVM Compiler 7.0 - Language 中 Enable Objective-C Exceptions 为YES详
    02-08
  • 解决tomcat出现:java.lang.IllegalStateException:无输出目录问题
    解决tomcat出现:java.lang.IllegalStateExcepti
    目录tomcat出现:java.lang.IllegalStateException:无输出目录问题描述原因分析解决方案总结tomcat出现:java.lang.IllegalStateException:无输出目录问题描述tomcat分为安装版和解压缩版,解压缩版如果解压到安装盘,在浏览器中访问http://localhost:8080,可
  • php Exception异常处理详解
    目录PHP 异常处理异常是什么异常的基本使用Try与throw和catch创建一个自定义的 Exception 类多个异常重新抛出异常设置顶层异常处理器异常的规则PHP 异常处理异常用于在指定的错误发生时改变脚本的正常流程。异常是什么异常处理用于在指定的错误(异常)情况发
点击排行