• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++编程异常处理中try和throw以及catch语句的用法

C++编程异常处理中try和throw以及catch语句的用法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ throw,c++ try catch用法,c++ try catch,try catch throw,java try catch throw等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

若要在 C++ 中实现异常处理,你可以使用 try、throw 和 catch 表达式。
首先,使用 try 块将可能引发异常的一个或多个语句封闭起来。
throw 表达式发出信号,异常条件(通常是错误)已在 try 块中发生。你可以使用任何类型的对象作为 throw 表达式的操作数。该对象一般用于传达有关错误的信息。大多数情况下,建议你使用 std::exception 类或标准库中定义的派生类之一。如果其中的类不合适,建议你从 std::exception 派生自己的异常类。
若要处理可能引发的异常,请在 try 块之后立即实现一个或多个 catch 块。每个 catch 块指定它能处理的异常类型。
以下示例将显示 try 块及其处理程序。假设 GetNetworkResource() 通过网络连接获取数据,并且两个异常类型是从 std::exception 派生的用户定义的类。请注意,异常由 catch 语句中的 const 引用捕获。我们建议你通过值引发异常并通过常数引用将其捕获。

MyData md;
try {
 // Code that could throw an exception
 md = GetNetworkResource();
}
catch (const networkIOException& e) {
 // Code that executes when an exception of type
 // networkIOException is thrown in the try block
 // ...
 // Log error message in the exception object
 cerr << e.what();
}
catch (const myDataFormatException& e) {
 // Code that handles another exception type
 // ...
 cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
 // ...
 if (IOSuccess == false)
  throw networkIOException("Unable to connect");
 // ...
 if (readError)
  throw myDataFormatException("Format error"); 
 // ...
}

</div>

备注
try 子句后的代码是代码的受保护部分。 throw 表达式将引发(即引起)异常。 catch 子句后的代码块是异常处理程序。如果 throw 和 catch 表达式中的类型兼容,该处理程序将捕获引发的异常。有关管理 catch 块中类型匹配的规则的列表,请参阅Catch 块的计算方式 (C++)。如果 catch 语句指定省略号 (...) 而非类型,catch 块将处理每种类型的异常。当你使用 /EHa 选项编译时,异常可包括 C 结构化异常和系统生成或应用程序生成的异步异常,例如内存保护、被零除和浮点冲突。由于 catch 块按编程顺序处理以查找匹配类型,所以尽量不要使用省略号处理程序来处理关联的 try 块。请谨慎使用 catch(...);除非 catch 块知道如何处理捕获的特定异常,否则禁止程序继续执行。 catch(...) 块一般用于在程序停止执行前记录错误和执行特殊的清理工作。
没有操作数的 throw 表达式将重新引发当前正在处理的异常。我们建议在重新引发异常时采用该形式,是因为这将保留原始异常的多态类型信息。此类表达式只应在 catch 处理程序中或从 catch 处理程序调用的函数中使用。重新引发的异常对象是原始异常对象,而不是副本。

try {
 throw CSomeOtherException();
}
catch(...) {
 // Catch all exceptions – dangerous!!!
 // Respond (perhaps only partially) to the exception, then
 // re-throw to pass the exception to some other handler
 // ...
 throw;
}
</div>

Catch 块的计算方式 (C++)
虽然通常建议您引发派生自 std::exception 的类型,但 C++ 使您能够引发任何类型的异常。可以通过指定与引发的异常相同的类型的 catch 处理程序或通过可捕获任何类型的异常的处理程序来捕获 C++ 异常。
如果引发的异常的类型是类,它还具有基类(或类),则它可由接受异常类型的基类和对异常类型的基的引用的处理程序捕获。请注意,当异常由引用捕获时,会将其绑定到实际引发的异常对象;否则,它将为一个副本(与函数的参数大致相同)。
引发异常时,将由以下类型的 catch 处理程序捕获该异常:

  • 可以接受任何类型的处理程序(使用省略号语法)。
  • 接受与异常对象相同的类型的处理程序;由于它是副本,因此 const 和 volatile 修饰符将被忽略。
  • 接受对与异常对象相同的类型的引用的处理程序。
  • 接受对与异常对象相同的类型的 const 或 volatile 形式的引用的处理程序。
  • 接受与异常对象相同的类型的基类的处理程序;由于它是副本,因此 const 和 volatile 修饰符将被忽略。基类的 catch 处理程序不得位于派生类的 catch 处理程序的前面。
  • 接受对与异常对象相同的类型的基类的引用的处理程序。
  • 接受与异常对象相同的类型的基类的 const 或 volatile 形式的引用的处理程序。
  • 接受可通过标准指针转换规则将引发的指针对象转换为的指针的处理程序。

catch 处理程序出现的顺序是有意义的,因为给定 try 块的处理程序按它们的出现顺序进行检查。例如,将基类的处理程序放置在派生类的处理程序的前面是错误的。 找到一个匹配的 catch 处理程序后,不会检查后续处理程序。因此,省略号 catch 处理程序必须是其 try 块的最后一个处理程序。例如:

// ...
try
{
 // ...
}
catch( ... )
{
 // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
 cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
 // Handle CExcptClass exception here.
}
</div>

在此示例中,省略号 catch 处理程序是已检查的唯一处理程序。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈C++函数声明后面加throw()的作用(必看)
  • C++中异常处理的基本思想及throw语句抛出异常的使用
  • 解析C++编程中异常相关的堆栈展开和throw()异常规范
  • C++编程异常处理中try和throw以及catch语句的用法

相关文章

  • 2017-05-28详解C++设计模式编程中策略模式的优缺点及实现
  • 2017-05-28VC解析XML文件-CMarkup的使用详解
  • 2017-05-28C++中用两个标准容器stack,实现一个队列的方法详解
  • 2017-05-28C++中的while循环和for循环语句学习教程
  • 2017-05-28C++编程中的格式化输出详解
  • 2017-05-28关于C++中虚拟继承的一些总结分析
  • 2017-05-28大数(高精度数)模板(分享)
  • 2017-05-28原创的C语言控制台小游戏
  • 2017-08-17c计算闰年
  • 2017-05-28C语言实现杨辉三角实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 基于C程序启动代码的深入分析
    • C++多继承同名隐藏实例详细介绍
    • 获取本地网卡适配器信息具体代码
    • 方阵顺时针旋转的实现代码
    • VC实现A进程窗口嵌入到B进程窗口中显示的方法
    • 怎么实现类的成员函数作为回调函数
    • C++内核对象封装单实例启动程序的类
    • MySQL的内存表的基础学习教程
    • C 语言快速排序实例代码
    • 使用C语言构建基本的二叉树数据结构

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有