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 中执行系统外部命令
Oct 09 PHP
新版PHP极大的增强功能和性能
Oct 09 PHP
PHP控制网页过期时间的代码
Sep 28 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 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
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
php简单复制文件的方法
2016/05/09 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
PHP7新增函数
2021/03/09 PHP
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
vue中的router-view组件的使用教程
2018/10/23 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
python验证码图片处理(二值化)
2019/11/01 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
毕业生自我推荐
2013/11/04 职场文书
小学运动会表扬稿
2014/01/19 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
房贷工资证明范本
2015/06/12 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs