问题标签 [exception-specification]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
193 浏览

c++ - boost::bind 在绑定抛出异常的函数时在 VC++ 2010 中不起作用

我有一些在 Linux 下编译良好的代码,但我正在尝试将其移植到 Windows。我使用了来自 Boost Pro 的 Boost 1.50 预编译二进制文件,但是当我编译我的代码时,我得到了这个神秘的错误:

该错误是最无用的,因为它显示在 Boost 头文件的深处,没有表明我的代码中的问题出在哪里。尽管如此,通过注释掉各种代码块,我已将其缩小为原因:

如果我删除throw函数定义中的说明符,它会起作用。我扔什么都没关系,无论是一个类还是一个int. 我做错了什么,还是不能绑定到在 Visual C++ 中引发异常的函数?Boost Bind 文档似乎没有提出任何问题,而且 GCC 也没有任何问题。

[旁注:上面的代码不是我的实际代码,但在编译时会出现同样的问题。请避免关于抛出整数不好之类的评论,因为这只是一个微不足道的例子,以防万一有人希望重现该问题。]

0 投票
1 回答
122 浏览

c++ - ocl::CRException 的类型信息

我尝试使用 g++ 运行我的 C++ 程序,但出现以下异常: “typeinfo for ocl::CRException”正在使用包含 CRException 类的 ocl 命名空间。请帮助我。

这是包含 OCL 类的代码:

0 投票
1 回答
84 浏览

c++ - 抛出异常类型没有限制

我了解到,当我指定函数可以抛出的异常类型时,不能抛出其他异常,但是当我测试这段代码时,它没有遵循这条规则。

我误解了什么吗?

0 投票
2 回答
1756 浏览

c++ - 为什么在编译时不检查 C++ 异常规范?

我刚刚读到在 C++11 标准修订版中,不推荐使用异常规范。我以前认为指定你的函数可能会抛出什么是好的做法,但显然不是这样。

在阅读了 Herb Stutter 被广泛引用的文章之后,我不禁想知道:到底为什么异常规范是以它们的方式实现的,为什么委员会决定弃用它们而不是在编译时检查它们?为什么编译器甚至允许抛出未出现在函数定义中的异常?对我来说,这听起来像是在说“你可能不应该指定你的函数返回类型,因为当你指定int f(),但return 3.5;在它里面,你的程序可能会崩溃。” (即,与强类型的概念区别在哪里?)

(由于 s 中缺乏异常规范支持typedef,鉴于模板语法可能是图灵完备的,实现这听起来很容易。)

0 投票
1 回答
81 浏览

c++ - 如何获得有关旧异常规范的警告

我知道除其他外(如 auto_ptr),异常规范在 C++11 中已被弃用。

有没有办法使用以下代码从 g++ 4.8 获得警告?

我已经尝试过-Wall -pedantic -Wextra -Wdeprecated-declarations,但没有任何成功。

0 投票
2 回答
177 浏览

c++11 - 类外定义的默认移动操作的异常规范是什么?

考虑这个类:

因为 C1 的 move ctor 在它的第一个声明中被显式默认,标准的 8.4.2 告诉我们它具有相同的异常规范 (ES),就好像函数被隐式声明一样。然后我们可以使用 15.4/14 和 12.8/15 得出其 ES 为 的结论noexcept(true)

现在考虑一个相同的类 C2,除了它的移动 ctor 在类定义之外是默认的:

C2 的 move ctor 的 ES 是什么?因为它在第一次声明时没有默认,所以 8.4.2/2 不适用。因为它没有明确的 ES,所以 8.4.2/3 不适用。因为它没有隐式声明,所以 15.4/14 不适用。据我所知,这意味着 15.4/12 适用,它表示默认函数 ES 是noexcept(false).

如果我是对的,那意味着 C1 中的移动 ctor 是noexcept(true),但 C2 中概念上相同的移动 ctor 是noexcept(false)

我对 C2 的推理是否正确?

0 投票
1 回答
98 浏览

c++ - 异常规范作为函数声明中的注释

我在代码中使用 C++ 异常而不是返回值来指示错误,因此我的代码必须是异常安全的。因此,我在函数声明中添加了一个异常规范作为注释。例如:

这是好习惯吗?

此外,如果我评估我的代码以制定这些规范,我是否必须只记住 C++ 异常或 SEH 异常,例如取消引用 nullptr、溢出或除以零异常?

假设我使用了一个 3rd-party 库,它永远不会抛出 C++ 异常,但可能会抛出 SEH 异常。我的函数,它依赖于那个库的函数,可以永远是 noexcept 吗?

0 投票
3 回答
3138 浏览

c++ - 过渡到使用 noexcept 隐式声明析构函数的 C++11

在 C++11 中,没有任何异常规范的析构函数用 隐式声明noexcept,这是对 C++03 的更改。因此,过去在 C++03 中从析构函数中抛出的代码在 C++11 中仍然可以正常编译,但一旦尝试从这样的析构函数中抛出,就会在运行时崩溃。

由于这样的代码没有编译时错误,它如何安全地转换到 C++11,没有将代码库中所有现有的析构函数声明为 is noexcept(false),这将是非常冗长和侵入性的,或者检查每个析构函数是否可能抛出,这将非常耗时且容易出错,或者在运行时捕获并修复所有崩溃,这永远不能保证找到所有此类情况?

0 投票
1 回答
1372 浏览

c++ - 为什么 std::map find() 没有声明为 noexcept?

C++14 标准定义的 find() 成员函数std::map如下:

为什么这些函数没有定义为noexcept?内部可能出现什么问题,需要抛出异常或产生未定义的行为(除了找不到元素,在这种情况下函数返回end迭代器并且无论如何都不需要抛出异常)?

0 投票
2 回答
246 浏览

c++ - 使用 sed 从 C++ 代码中删除异常规范

我想从我的 c++ 代码中自动删除不推荐使用的异常规范,并尝试使用 sed 来完成此任务。

异常规范格式throw后面是括号之间的异常(单词)列表,所以我写了这个 sed:

它适用于单行规范,但不适用于多行规范。

根据文档,点似乎与换行符不匹配,它必须:https ://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

我尝试了这种解决方法,但它也不起作用(实际上它甚至不适用于单行规范):

如何让它正常工作?

编辑

异常规范示例: