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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
yii操作session实例简介
Jul 31 PHP
php实现比较全的数据库操作类
Jun 18 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
YII2框架中添加自定义模块的方法实例分析
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导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
javascript闭包入门示例
2014/04/30 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
设置python3为默认python的方法
2018/10/31 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
python 实现视频 图像帧提取
2019/12/10 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
八年级物理教学反思
2014/01/19 职场文书
校园活动宣传方案
2014/03/28 职场文书
毕业设计论文评语
2014/12/31 职场文书
综合素质自我评价评语
2015/03/06 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
实现GO语言对数组切片去重
2022/04/20 Golang