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 相关文章推荐
模仿OSO的论坛(二)
Oct 09 PHP
PHP连接SQLServer2005 的问题解决方法
Jul 19 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
php猴子选大王问题解决方法
May 12 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP实现的购物车类实例
Jun 17 PHP
php实现的简单检验登陆类
Jun 18 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
php 数组元素快速去重
May 05 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
详解JS面向对象编程
2016/01/24 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
详解js中==与===的区别
2017/01/08 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
Python编程之序列操作实例详解
2017/07/22 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
python如何调用php文件中的函数详解
2020/12/29 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
任命书范本大全
2014/06/06 职场文书
四则混合运算教学反思
2016/02/23 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android