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 相关文章推荐
计数器详细设计
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
php将数据库导出成excel的方法
May 07 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
thinkphp分页集成实例
Jul 24 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 PHP
is_file和file_exists效率比较
Mar 14 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
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
JS 控制CSS样式表
2009/08/20 Javascript
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
电脑专业个人求职信范文
2014/02/04 职场文书
教师师德师风整改措施
2014/10/24 职场文书
2015年统战工作总结
2015/05/19 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
MySQL RC事务隔离的实现
2022/03/31 MySQL