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 相关文章推荐
SSI指令
Nov 25 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP中的替代语法介绍
Jan 09 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
PHP strripos函数用法总结
Feb 11 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实现大文件断点续传下载实例代码
2019/10/01 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python复制文件到指定目录的实例
2018/04/27 Python
python实现连续图文识别
2018/12/18 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python编写单元测试代码实例
2020/09/10 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
经典的班主任推荐信
2013/10/28 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
职业生涯规划怎么写
2013/12/29 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
检讨书范文1000字
2015/01/28 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
总结Python使用过程中的bug
2021/06/18 Python