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 相关文章推荐
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
PHP调用Webservice实例代码
Jul 29 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
Sep 30 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
PHP扩展安装方法步骤解析
Nov 24 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实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python PO设计模式的具体使用
2019/08/16 Python
python 动态调用函数实例解析
2019/10/21 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
投资协议书范本
2014/04/21 职场文书
授权委托书
2014/07/31 职场文书
作风建设年活动总结
2014/08/27 职场文书
2015年加油站工作总结
2015/05/13 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
Nginx配置使用详解
2022/07/07 Servers