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 相关文章推荐
Banner程序
Oct 09 PHP
php下实现农历日历的代码
Mar 07 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
php随机抽奖实例分析
Mar 04 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
yii2 resetful 授权验证详解
May 18 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 抽象类的简单应用
2011/09/06 PHP
Destoon模板制作简明教程
2014/06/20 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
javascript 写类方式之一
2009/07/05 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
python中pass语句用法实例分析
2015/04/30 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
森林防火工作方案
2014/02/14 职场文书
上班玩手机检讨书
2014/02/17 职场文书
委托函范文
2015/01/29 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
python获取对象信息的实例详解
2021/07/07 Python
MySql分区类型及创建分区的方法
2022/04/13 MySQL