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


Posted in PHP onJune 12, 2014

使用异常

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 相关文章推荐
如何做到多笔资料的同步
Oct 09 PHP
c#中的实现php中的preg_replace
Dec 21 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
使用swoole扩展php websocket示例
Feb 13 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
CodeIgniter扩展核心类实例详解
Jan 20 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 #PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 #PHP
对PHP语言认识上需要避免的10大误区
Jun 12 #PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 #PHP
You might like
php MYSQL 数据备份类
2009/06/19 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php实现用户登陆简单实例
2017/04/04 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
关于Javascript中document.cookie的使用
2017/03/08 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python如何读写CSV文件
2020/08/13 Python
法学专业个人求职信
2013/09/26 职场文书
教师一岗双责责任书
2014/04/16 职场文书
文案策划专业自荐信
2014/07/07 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server