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 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
一个很不错的PHP翻页类
Jun 01 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
PHP与SQL语句常用大全
Dec 10 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
laradock环境docker-compose操作详解
Jul 29 PHP
php中对象引用和复制实例分析
Aug 14 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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的ASP防火墙
2006/10/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
详解Python的Django框架中的中间件
2015/07/24 Python
zookeeper python接口实例详解
2018/01/18 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
Django 大文件下载实现过程解析
2019/08/01 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
学雷锋树新风演讲稿
2014/05/10 职场文书
会计电算化专业求职信
2014/06/10 职场文书
运动会报道稿300字
2014/10/02 职场文书
2014年科技工作总结
2014/11/26 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2015选调生工作总结
2015/07/24 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
python小程序之飘落的银杏
2021/04/17 Python
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android