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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
PHP 中的批处理的实现
Jun 14 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
使用php语句将数据库*.sql文件导入数据库
May 05 PHP
symfony表单与页面实现技巧
Jan 26 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
php微信开发之上传临时素材
Jun 24 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
Laravel框架控制器的request与response用法示例
Sep 30 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
Zerg建筑一览
2020/03/14 星际争霸
php中curl和file_get_content的区别
2014/05/10 PHP
PHP加密解密函数详解
2015/10/28 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
运动会广播稿80字
2014/01/23 职场文书
新品发布会主持词
2014/04/02 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
药房管理制度范本
2015/08/06 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
python状态机transitions库详解
2021/06/02 Python
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript