在析构函数中正确使用 std::uncaught_exception

2023-11-27

有一些文章的结论是“永远不要从析构函数抛出异常”和“std::uncaught_exception() 没有用”,例如:

  • http://www.gotw.ca/gotw/047.htm(赫伯·萨特撰写)

但我似乎没有明白这一点。所以我写了一个小的测试示例(见下文)。

由于测试示例一切正常,我非常感谢一些关于它可能有什么问题的评论?

测试结果:

./main



    Foo::~Foo(): caught exception - but have pending exception - ignoring
    int main(int, char**): caught exception: from int Foo::bar(int)
  

./main 1



    Foo::~Foo(): caught exception -  but *no* exception is pending - rethrowing
    int main(int, char**): caught exception: from Foo::~Foo()
  

example:

// file main.cpp
// build with e.g. "make main"
// tested successfully on Ubuntu-Karmic with g++ v4.4.1
#include <iostream>

class Foo {
  public:

  int bar(int i) {
    if (0 == i)
      throw(std::string("from ") + __PRETTY_FUNCTION__);
    else
      return i+1;
  }

  ~Foo() {
    bool exc_pending=std::uncaught_exception();
    try {
      bar(0);
    } catch (const std::string &e) {
      // ensure that no new exception has been created in the meantime
      if (std::uncaught_exception()) exc_pending = true;

      if (exc_pending) {
        std::cerr << __PRETTY_FUNCTION__ 
                  << ": caught exception - but have pending exception - ignoring"
                  << std::endl;
      } else {
        std::cerr << __PRETTY_FUNCTION__
                  << ": caught exception -  but *no* exception is pending - rethrowing"
                  << std::endl;
        throw(std::string("from ") + __PRETTY_FUNCTION__);
      }
    }
  }

};

int main(int argc, char** argv) {
  try {
    Foo f;
    // will throw an exception in Foo::bar() if no arguments given. Otherwise
    // an exception from Foo::~Foo() is thrown.
    f.bar(argc-1);
  } catch (const std::string &e) {
    std::cerr << __PRETTY_FUNCTION__ << ": caught exception: " << e << std::endl;
  }
  return 0;
}

ADDED:换句话说:尽管有些文章中有警告,但它仍按预期工作 - 那么它可能有什么问题呢?


赫伯·萨特指的是另一个问题。他正在谈论:

try
{
}
catch (...)
{
    try
    {
        // here, std::uncaught_exception() will return true
        // but it is still safe to throw an exception because
        // we have opened a new try block
    }
    catch (...)
    {
    }
}

所以问题是如果std::uncaught_exception()返回 true 你不确定是否可以安全地抛出异常。你最终必须避免抛出异常std::uncaught_exception()为了安全起见,返回 true。

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

在析构函数中正确使用 std::uncaught_exception 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 如何防止浏览器图片缓存?

    阻止浏览器在 PHP 中缓存图像的最佳方法是什么 我已经尝试过header method header Expires Tue 03 Jul 2001 06 00 00 GMT header Last Modified gmdate D d
  • C++有序(稳定)优先级队列

    我正在实现一个玩具调度程序 它读取进程规范的输入文件 例如到达时间 总运行时间 然后根据随机 io cpu 突发来调度进程 该文件的格式为 到达时间 CPU 总时间 CPU 突发 IO 突发 现在 当有两个进程具有相同的到达时间时 调度程序
  • 活动别名的启动意图

    我为具有不同元数据的活动设置了一些别名 在此元数据中 我设置了片段的名称 然后通过反射加载该片段 我不知道这是否是一个 干净 的解决方案 尽管通过使用片段并将功能放入其中 我有一个 SuperActivity 和 2 个空子活动 只是为了在
  • AJAX 上的 301 重定向——重定向?

    我对服务器端点进行 AJAX 调用 该端点执行 301 重定向到同一页面 但末尾带有斜杠 当使用 AJAX 调用时 浏览器是否遵循重定向 或者是否忽略它们 就我而言 它不遵循它们 但我认为这可能是服务器配置中的某些内容 如果您使用 jque
  • 带类的词典?

    在Python中可以通过字典实例化一个类吗 shapes 1 Square 2 Circle 3 Triangle x shapes raw input 我想让用户从菜单中进行选择 而不是在输入上编写大量的 if else 语句 例如 如果
  • 在 Eclipse 中,如何多次运行 JUnit 测试用例

    我有一个单元测试有时会失败 调试它很痛苦 因为我不知道为什么它有时会失败 有没有办法在 Eclipse 中运行 JUnit 测试 5 次或 50 次之类的 Thanks 我刚刚找到了以下解决方案 它不需要任何额外的依赖项 您得到的答案之一需
  • 使用 jQuery fadeIn 或 CSS3 动画哪个更好?

    我正在使用一些 PHP 和 JavaScript 创建一个简单的画廊 并尝试在图像之间进行淡入淡出过渡 然后我想知道使用 CSS 动画是否存在性能差异 例如 webkit keyframes fadeIn 0 opacity 0 100 o
  • 将 Word DOCX 文件保存为 PDF [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在使用 openxml 创建 Word DOCX 文件 我想在将这些文档创建为 PDF 文件后将其保存 有没有办法在 openxml 中做到这一
  • Handpose tfjs 错误 - 在注册表中找不到后端

    当尝试运行 Handpose tfjs 的演示项目时 我收到以下错误 我的 package json 文件具有以下依赖项 name tensorflowJs version 1 0 0 description main index js s
  • Laravel 5.3 auth 检查构造函数返回 false

    我在用着Laravel 5 3我正在努力得到经过验证的 user s id in the constructor方法 这样我就可以按分配的公司过滤用户 如下所示 namespace App Http Controllers use Illu
  • Android Room - 通过自动生成获取新插入行的 id

    这就是我使用 Room Persistence Library 将数据插入数据库的方式 Entity Entity class User PrimaryKey autoGenerate true public int id 数据访问对象 D
  • 在 Javascript 中将 yyyy-mm-dd 转换为 UTC

    我需要仅使用 javascript 将 yyyy mm dd 中的日期 如 2011 12 30 转换为 UTC 如何 var utc new Date 2011 12 30 toUTCString jsFiddle
  • sed/awk - 在跨多行的模式之间打印文本

    我是脚本编写新手 正在尝试学习如何提取两种不同模式之间存在的任何文本 但是 我仍然无法弄清楚如何在以下场景中提取两种模式之间的文本 如果我有我的输入文件阅读 Hi I would like to print text between the
  • node-postgres如何转义参数?

    我知道关于参数化查询 但由于我必须以编程方式构造哪里条件 计算参数的数量并构建参数数组是一项比简单地调用escape需要时发挥作用 所以 node postgres 中有参数转义函数吗 Yes since this PR there are
  • 如何使用 cin 读取 double 的整个值?

    long double m cout lt lt enter double cin gt gt m cout lt lt m lt lt m lt
  • 如何将日期转换为月份数?

    我有一个专栏Month在我的桌子上 月份名称和日期存储在本月列中 例如 Month 01 JAN 12 02 FEB 12 等等 我如何convert the DATE转换为月份数字 例如 Month 1 2 etc select to c
  • “shouldOverrideUrlLoading”真的被弃用了吗?我可以用什么来代替?

    shouldOverrideUrlLoading 真的被弃用了吗 如果是这样 我可以用什么来代替 这好像是shouldOverrideUrlLoading已弃用针对 Android N我需要让一个应用程序从 API 19 开始工作 直到现在
  • 如何在 Android 浏览器中启用安全搜索

    要求 我的浏览器要求在浏览时启用 禁用安全搜索 On Google 安全搜索页面 使用安全搜索阻止 Google 上的露骨搜索结果 您可以过滤 Google 上的露骨搜索结果 例如色情内容 使用安全搜索设置 安全搜索并非 100 准确 但它
  • 如何使用 adb shell 移动文件?

    如何使用 adb shell 移动文件 例如我想将 SystemUI apk 从 system 移动到 system app 我没有找到任何使用 adb shell 在系统分区内移动文件的命令 有谁知道该怎么做 Does mv不行 mv s
  • 在析构函数中正确使用 std::uncaught_exception

    有一些文章的结论是 永远不要从析构函数抛出异常 和 std uncaught exception 没有用 例如 http www gotw ca gotw 047 htm 赫伯 萨特撰写 但我似乎没有明白这一点 所以我写了一个小的测试示例