PHP异常处理浅析


Posted in PHP onMay 12, 2015

PHP预定了两个异常类:Exception和ErrorException

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 ) //异常追踪信息(array)

    final public string getTraceAsString ( void ) //异常追踪信息(string)

    public string __toString ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值

    final private void __clone ( void ) //克隆异常对象时调用

}
ErrorException  extends Exception  {

 

    /* 属性 */

    protected int $severity   ;

    /* 方法 */

    

    public __construct  ([ string $message  = ""  [, int $code  = 0  [, int $severity  = 1  [, string $filename  = __FILE__  [, int $lineno  = __LINE__  [, Exception  $previous  = NULL    ]]]]]] )

    final public int getSeverity  ( void )

    /* 继承的方法 */

    final public string Exception::getMessage  ( void )

    final public Exception Exception::getPrevious  ( void )

    final public int Exception::getCode  ( void )

    final public string Exception::getFile  ( void )

    final public int Exception::getLine  ( void )

    final public array Exception::getTrace  ( void )

    final public string Exception::getTraceAsString  ( void )

    public string Exception::__toString  ( void )

    final private void Exception::__clone  ( void )

}

那么如何捕获异常?

(1)PHP可用try...catch...捕获异常,进行异常处理的代码必须在try代码块内。

try {

    throw new Exception('exception test 1', 1001);

} catch(Exception $e) {

    echo $e->getMessage().'-'.$e->getCode();

}

(2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。

function  exception_handler ( $e ) {

    echo  "Uncaught exception: "  ,  $e -> getMessage (),  "\n" ;

}

 

set_exception_handler ( 'exception_handler' );

 

throw new  Exception ( 'Uncaught Exception' );

 

echo "这行不会执行了";

可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。
(3)PHP可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。

//请根据实际扩展异常类

class MyException extends Exception {

    public function __construct($message = '', $code = 0) {

 

    }

 

    public function myFunction() {

        echo 'just for test';

    }

}

 

try {

    throw new MyException('an error');

} catch (MyException $e) {

    echo $e->myFunction();

} catch (Exception $e) {

    echo $e->getMessage();

}

(4)PHP5.5已经支持finally关键词,你无需关心异常是否溢出了。

PHP异常处理浅析

可对比如下:

function doSomething() {

    $resource = createResource();

    try {

        $result = useResource($resource);

    } catch (Exception $e) {

        releaseResource($resource);

        log($e->getMessage());

        exit();

    }

    releaseResource($resource);

    return $result;

}

 

//使用finally后

function doSomething2() {

    $resource = createResource();

    try {

        $result = useResource($resource);

        return $result;

    } catch (Exception $e) {

        log($e->getMessage());

        exit();

    } finally {

        releaseResource($resource);

    }

}
PHP 相关文章推荐
php分页示例代码
Mar 19 PHP
PHP 七大优势分析
Jun 23 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
PHP面向对象精要总结
Nov 07 PHP
php中删除、清空session的方式总结
Oct 09 PHP
程序员的表白神器“520”大声喊出来
May 20 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
php根据命令行参数生成配置文件详解
Mar 15 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
php猴子选大王问题解决方法
May 12 #PHP
PHP嵌套输出缓冲代码实例
May 12 #PHP
php实现修改新闻时删除图片的方法
May 12 #PHP
php跨服务器访问方法小结
May 12 #PHP
php一个解析字符串排列数组的方法
May 12 #PHP
PHP获取远程图片并保存到本地的方法
May 12 #PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 #PHP
You might like
php不用正则采集速度探究总结
2008/03/24 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
公益活动策划方案
2014/01/09 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2014年创卫工作总结
2014/11/24 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python