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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
php中hashtable实现示例分享
Feb 13 PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 PHP
php写的AES加密解密类分享
Jun 20 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
linux下编译安装memcached服务
Aug 03 PHP
详解php的socket通信
Aug 11 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 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调用三种数据库的方法(3)
2006/10/09 PHP
简单易用的计数器(数据库)
2006/10/09 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python3中exp()函数用法分析
2019/02/19 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
武夷山导游词
2015/02/03 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
大学生活感想
2015/08/10 职场文书
初中体育课教学反思
2016/02/16 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
深入探讨opencv图像矫正算法实战
2021/05/21 Python