在哪里可以找到有关 C++/STL 方法异常保证的信息?

2024-03-11

前几天我正在编写带有异常处理的代码,我有一些关于异常、它们的保证和可抛出的问题。

基本上,假设你有:

class X {
string m_str;
X() : m_str("foo")//what if this throws?
{
    ifstream b("a.in")//what if this throws?
}

在浏览了我能找到的所有文章之后,我仍然不知道处理这个问题的干净方法是什么。

假设我有这样的代码:

{
    ...
    X myInstanceOfClassX;
    ...
}

我应该将代码包装在catch(exception &)?如果我这样做的话string and ifstream保证一个强有力的保证,没有资源泄漏,没有任何东西半开放?

另外,如果我的课抛出myexception,这是从异常中得出的,catch(exception &)似乎让它通过了。所以这让我catch(...)哪个 IIRC 捕获访问违规?.?还有别的办法吗?

然后有一条信息表明,在对象构造函数的子构造函数中抛出的任何异常都不应该被捕获,并且构造函数应该在任何成员对象抛出异常的情况下抛出。

如果上面的代码不是从构造函数调用,而是从常规函数调用会怎样?void foo(),我应该捕获哪些异常?内存不足,文件未找到?在哪里可以找到 STL 对象可以抛出的定义?它们是具体实施的吗?

哪里有权威的来源可以消除我对此主题的所有疑虑和疑问?

到目前为止,处理异常似乎就像在一大堆黏糊糊的东西里跳舞。错误代码看起来更简单、更安全......


如果其中任何一个抛出

class X {
string m_str;
X() : m_str("foo")//what if this throws?
{
    ifstream b("a.in")//what if this throws?
}

那么您创建的对象将不存在。
如果在对象的构造函数中引发异常,则所有完全创建的成员都会被析构(使用其析构函数),并且该对象的内存将返回给系统。因此,任何在抛出点未完全构造的成员都不会被销毁(因为它们尚未创建)。

  • 如果 m_str() 在初始化列表中抛出,那么该对象将永远不存在。
  • 如果 ifstream 在主体中抛出异常,那么 m_str 就会被销毁,并且该对象将永远不会存在。

我应该将代码包装在 catch(exception &) 中吗?如果我这样做,string 和 ifstream 是否能保证强有力的保证,即不会泄漏任何资源,也不会留下任何半打开的东西?

即使您捕获异常(在对象外部),也没有对象可以处理,因为它从未存在过(对象仅在构造函数完成后才开始其生命周期)。

在上述内容中,您可以保证没有泄漏或开放资源。

另外,如果我的类抛出 myException,它是从异常派生的,catch(exception &) 似乎会让它通过。这样我就剩下了 catch(...) IIRC 捕获访问冲突?.?还有别的办法吗?

如果您的异常源自 std::exception 那么catch(std::exception&)将工作。如果它不起作用,那么你做错了什么(但我们需要更多细节(例如抛出的代码和捕获的代码,英语描述是不够的))。

然后有一条信息表明,在对象构造函数的子构造函数中抛出的任何异常都不应该被捕获,并且构造函数应该在任何成员对象抛出异常的情况下抛出。

可能是最好的选择,而且一般来说,建议也不错。

如果上面的代码不是从构造函数调用,而是从常规函数 void foo() 调用,我应该捕获哪些异常呢?内存不足,文件未找到?在哪里可以找到 STL 对象可以抛出的定义?它们是具体实施的吗?

仅当您可以采取措施时才应捕获异常。通常这没什么,所以不要捕获它们,让应用程序正常退出(通过异常展开堆栈)。

哪里有权威的来源可以消除我对此主题的所有疑虑和疑问?

你的问题是如此多样化,这很难。
我可以推荐Herb Sutter 的《卓越的 C++》 http://www.gotw.ca/publications/xc++.htm.

到目前为止,处理异常似乎就像在一大堆黏糊糊的东西里跳舞。错误代码看起来更简单、更安全......

你错了。例外要容易得多。你似乎只是想太多并且感到困惑。这并不是说错误代码没有它们的位置。

如果出现问题and you can not fix it locally然后抛出异常。标准中的所有类在设计时都考虑到了异常,并且会正常运行。这样就只剩下你的课程了。

经验法则:(针对您的对象)

  • 确保你的类在析构函数中自行清理
  • 如果您的对象包含资源,请确保“遵守 3 规则”
  • 每个对象永远不要拥有多个资源。
    注意:您可以拥有多个东西,例如 std::string 或 std::ifstream ,因为它们是控制资源的东西(它们各自控制一个资源,因此您的类不控制该资源)。资源(在此上下文中)是您必须手动创建/销毁的东西。

就这样,其余的自动神奇地工作了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里可以找到有关 C++/STL 方法异常保证的信息? 的相关文章

随机推荐

  • OpenGL 点精灵可以在 Android 中使用吗?

    我正在 Droid 版本 2 1 update1 上进行开发 我支持的 GL 扩展包括 GL OES point sprite 和 GL OES point size array 我无法获取要渲染的点精灵 下面的代码在 glTexEnvi
  • 控制器间通信,角度方式

    我试图找出控制器 指令之间共享属性或状态的 首选 或 角度方式 有多种方法可以实现这一点 但我想遵循最佳实践 下面是一些如何实现这一点的平庸示例 1 使用 scope watch The parent controller scope an
  • 更改所有字符串属性最大长度

    在 EF 6 中我可以这样做 modelBuilder Properties Where p gt p PropertyType typeof string p GetCustomAttributes typeof MaxLengthAtt
  • Base64 值不是有效图像

    对于电子商务 我需要从 SOAP Web 服务获取产品图像 Web 服务的图像以 base64 编码 在我这边 我必须解码它们以将它们保存在 WordPress 目录中 我的所有代码都有效 即使它远非完美 唯一的问题是我无法从下面的 SOA
  • 为什么这个 Angular 应用程序无法处理用户状态(登录\退出),从而在用户登录后更改显示内容?

    我正在使用 AngularUI Angular 包 这个 https www npmjs com package firebaseui angular https www npmjs com package firebaseui angul
  • Bootstrap 4 动画列宽变化

    我有两列这样的 div class container div class row div class col 9 div div class col 3 div div div 我通过 Angular 将类名切换为col 8 offset
  • 在 Eclipse 中构建 Makefile 项目的步骤

    我正在尝试使用 Eclipse 构建一些现有软件 用 C 编写 它是使用 Makefile 构建的 为此 我在 Eclipse 中创建了一个 Makefile 项目 然而 我刚刚发现 在 C C 构建 设置 菜单中 我只看到 二进制解析器
  • 如何从 Windows 环境将 Xcode 项目添加到 Github 存储库

    看到我的问题标题后 您可能会认为以前已经问过此类问题 然而这并不重复 请阅读下面的内容来了解 我正在开发IOS应用程序 每当我有时间的时候 我都会使用图书馆的 PC 或朋友的 MacBook 来开发或更改现有项目 然后压缩该项目并将其上传到
  • 当没有数据可读取时,Socket read() 会挂起一段时间

    你好 我正在编写一个简单的 http 端口转发器 我从端口 80 读取数据 并将数据传递到端口 8080 上的 lighttpd 服务器 只要我在端口 8080 上的套接字上 write 数据 转发请求 就没有问题 但是当我从该套接字读取
  • 显示带有数据帧中的值的标签堆叠条形图

    如何显示来自数据框的堆积条形图的值 如何将标签放置在每个栏上各自部分的上方并修改字体 以便它显示为灰度图形 是有关系的对于这个问题 https stackoverflow com questions 30228069 how to disp
  • 用户注册后Django自动登录(1.4)

    我在成功注册用户时遇到问题 但是 我希望用户在注册时登录 这是代表我的注册视图的代码 关于用户不自动登录的原因有什么想法吗 Notes 用户已正确注册 之后即可登录 authenticate kwargs 返回正确的用户 在 setting
  • 即使对于简单实体,ProtoBuf 序列化也会丢失数据

    更新 1 我已将修改和修复的 演示 项目上传到https github com sidshetye SerializersCompare https github com sidshetye SerializersCompare其他人是否有
  • 如何有条件地停止 JavaScript 生成器?

    使用如下所示的迭代器 function idMaker let index 0 while index lt 3 yield index 如何确保根据情况提前停止发电机 function idMaker let index 0 while
  • Firebase 云函数错误代码和错误消息在 Android 上始终为内部

    我正在为我的应用程序开发一项功能 其中一个用户可以使用云功能向另一个用户发送通知 我的函数和通知按预期工作 但我无法以正确的方式处理错误 因为我的 Android 代码上总是出现 INTERNAL 错误 这是我的 Android 代码 pu
  • 如何获取 autoconf configure.ac 中顶级构建目录的绝对路径?

    我正在开发一个项目 该项目需要一个具有自己的 makefile 和 configure ac 的子项目 子项目是用于为主项目生成源文件的程序 有一个选项可以禁用该项目的构建并尝试使用已安装的版本 无论哪种情况 我都会创建一个在 Makefi
  • 监控显卡使用情况[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 当我运行某个应用程序时 如何监控显卡的使用情况 我想查看我的应用程序使用 GPU 的情况 如果您在 Visual Studio 201
  • 有效的 Java 第 11 条:明智地覆盖克隆

    对于具有数组字段的类 乔什说 如果克隆方法仅返回 super clone 则生成的类实例将在原始字段中具有正确的值 但其数组字段将引用与原始类实例相同的数组 修改原始内容将破坏不变量 反之亦然 他使用了自定义 Stack 实现的示例 我使用
  • 在swift中实现HMAC和SHA1加密

    我对 Swift 比较陌生 并且一直坚持使用 HMAC 和 SHA1 进行加密 我找到了以下答案https stackoverflow com a 24411522 4188344 https stackoverflow com a 244
  • AngularJS 中的模块和命名空间/名称冲突

    考虑下面的jsfiddlehttp jsfiddle net bchapman26 9uUBU 29 http jsfiddle net bchapman26 9uUBU 29 angular js example for factory
  • 在哪里可以找到有关 C++/STL 方法异常保证的信息?

    前几天我正在编写带有异常处理的代码 我有一些关于异常 它们的保证和可抛出的问题 基本上 假设你有 class X string m str X m str foo what if this throws ifstream b a in wh