0

0

php中try catch 捕获异常的例

php中文网

php中文网

发布时间:2016-05-26 08:21:32

|

1717人浏览过

|

来源于php中文网

原创

php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,下面本文章总结了捕获异常的一些用法例子.

PHP中try{}catch{}语句.

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

需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常,每一个 try 至少要有一个与之对应的 catch.

使用多个 catch可以捕获不同的类所产生的异常,当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行.

立即学习PHP免费学习笔记(深入)”;

当然,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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号