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 相关文章推荐
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
php中邮箱地址正则表达式实现与详解
Apr 24 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 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汉字转拼音的示例
2014/02/27 PHP
PHP引用的调用方法分析
2016/04/25 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python 装饰器使用详解
2017/07/29 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
python 瀑布线指标编写实例
2020/06/03 Python
python动态规划算法实例详解
2020/11/22 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
2014年共青团工作总结
2014/12/10 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技
Python pyecharts绘制条形图详解
2022/04/02 Python