php中try catch捕获异常实例详解


Posted in PHP onNovember 21, 2014

本文实例讲述了php中try catch捕获异常。分享给大家供大家参考。具体方法分析如下:

php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,感兴趣的朋友可以一起来看看。

PHP中try{}catch{}语句概述

PHP5添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。(注:一定要先抛才能获取)

需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。

每一个 try 至少要有一个与之对应的 catch。

使用多个 catch可以捕获不同的类所产生的异常。

当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。

当然,PHP允许在 catch 代码块内再次抛出(throw)异常。

当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。

如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。

先来看一下PHP内置异常类的基本属性和方法。(不包括具体实现)

try{

}

catch(){

throw new Exception();

}

catch(){

//这里可以捕获到前面一个块抛出的Exception

}

为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。以下显示了我们处理getCommandObject()抛出的异常的方法:

<?php

try {

$mgr = new CommandManager();

$cmd = $mgr->getCommandObject("realcommand");

$cmd->execute();

} catch (Exception $e) {

print $e->getMessage();

exit();

}

?>

可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。

如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。

例子如下:

包含文件错误抛出异常

<?php

// 错误的演示

try {

require ('test_try_catch.php');

} catch (Exception $e) {

echo $e->getMessage();

}
// 正确的抛出异常

try {

if (file_exists('test_try_catch.php')) {

require ('test_try_catch.php');

} else {

throw new Exception('file is not exists');

}

} catch (Exception $e) {

echo $e->getMessage();

}

如果异常抛出了却没有被捕捉到,就会产生一个fatal error。

多个catch捕获多个异常

PHP将查询一个匹配的catch代码块。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行。多个异常的捕获的示例如下:

<?php 

    class MyException extends Exception{

           //重定义构造器使第一个参数message变为必须被指定的属性

           public function __construct($message, $code=0){

               //可以在这里定义一些自己的代码

               //建议同时调用parent::construct()来检查所有的变量是否已被赋值

               parent::__construct($message, $code);

           }

           //重写父类中继承过来的方法,自定义字符串输出的样式

           public function __toString(){

               return __CLASS__.":[".$this->code."]:".$this->message."<br>";

           }

           //为这个异常自定义一个处理方法

           public function customFunction(){

               echo "按自定义的方法处理出现的这个类型的异常";

           }

    }

 

    //创建一个用于测试自定义扩展的异常类MyException

    class TestException{

        public $var;           //用来判断对象是否创建成功的成员属性

        function __construct($value=0){              //通过构造方法的传值决定抛出的异常

            switch($value){                          //对传入的值进行选择性的判断

                case 1:                              //掺入参数1,则抛出自定义的异常对象

                    throw new MyException("传入的值“1”是一个无效的参数",5);break;

                case 2:                              //传入参数2,则抛出PHP内置的异常对象

                    throw new MyException("传入的值“2”不允许作为一个参数",6);break;

                default:                             //传入参数合法,则不抛出异常

                    $this->var=$value;break;          //为对象中的成员属性赋值

            }

        }

    }

 

    //示例1,在没有异常时,程序正常执行,try中的代码全部执行并不会执行任何catch区块

    try{

        $testObj =new TestException();           //使用默认参数创建异常的擦拭类对象

        echo "********<br>";                     //没有抛出异常这条语句就会正常执行

    }catch(MyException $e){                      //捕获用户自定义的异常区块

        echo "捕获自定义的异常:$e<br>";          //按自定义的方式输出异常消息

        $e->customFunction();                    //可以调用自定义的异常处理方法

    }catch(Exception $e){                        //捕获PHP内置的异常处理类的对象

        echo "捕获默认的异常:".$e->getMessage()."<br>";       //输出异常消息

    }

    var_dump($testObj);        //判断对象是否创建成功,如果没有任何异常,则创建成功

 

    //示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理

    try{

        $testObj1 =new TestException(1);         //传1时,抛出自定义异常

        echo "********<br>";                     //这个语句不会被执行

    }catch(MyException $e){                      //这个catch区块中的代码将被执行

        echo "捕获自定义的异常:$e<br>";          

        $e->customFunction();                    

    }catch(Exception $e){                        //这个catch区块不会执行

        echo "捕获默认的异常:".$e->getMessage()."<br>";       

    }

    var_dump($testObj1);        //有异常产生,这个对象没有创建成功

 

    //示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理

    try{

        $testObj2 =new TestException(2);         //传入2时,抛出内置异常

        echo "********<br>";                     //这个语句不会被执行

    }catch(MyException $e){                      //这个catch区块中的代码将被执行

        echo "捕获自定义的异常:$e<br>";          

        $e->customFunction();                    

    }catch(Exception $e){                        //这个catch区块不会执行

        echo "捕获默认的异常:".$e->getMessage()."<br>";       

    }

    var_dump($testObj2);        //有异常产生,这个对象没有创建成功

?>

在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception。分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行。如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php a simple smtp class
Nov 26 PHP
晋城吧对DiscuzX进行的前端优化要点
Sep 05 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
学习php分页代码实例
Oct 24 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
PHP7正式版测试,性能惊艳!
Dec 08 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 PHP
PHP生成不重复标识符的方法
Nov 21 #PHP
php中HTTP_REFERER函数用法实例
Nov 21 #PHP
php中call_user_func函数使用注意事项
Nov 21 #PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 #PHP
php常用数学函数汇总
Nov 21 #PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 #PHP
php防止恶意刷新与刷票的方法
Nov 21 #PHP
You might like
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
jquery.validate使用攻略 第二部
2010/07/01 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
python实现双人五子棋(终端版)
2020/12/30 Python
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
护士毕业生自我鉴定
2014/02/08 职场文书
高三家长寄语
2014/04/03 职场文书
计生专干事迹
2014/05/28 职场文书
学校运动会霸气口号
2014/06/07 职场文书
宣传口号大全
2014/06/16 职场文书
获奖感言怎么写
2015/07/31 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Python List remove()实例用法详解
2021/08/02 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server