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 相关文章推荐
多php服务器实现多session并发运行
Oct 09 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php 删除cookie和浏览器重定向
Mar 16 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
Jun 12 PHP
php文件操作相关类实例
Jun 18 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
tp5.1框架数据库子查询操作实例分析
May 26 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公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
js单词形式的运算符
2014/05/06 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
jQuery操作cookie
2016/08/08 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python读取中文txt文本的方法
2018/04/12 Python
Python 实现try重新执行
2019/12/21 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
罗技美国官网:Logitech美国
2020/01/22 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
成人教育自我鉴定
2013/11/01 职场文书
生物科学专业个人求职信范文
2013/12/07 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
销售队伍口号
2014/06/11 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸