C++:表示函数可能抛出
C++: Indicating a function may throw
可能重复:
有没有一个公认的习语可以用来指示C++代码可以抛出异常?
如何在代码中指示C++函数何时可以抛出某些东西?我的意思不是通过文档,而是通过语法。
例如,我试图在函数声明的末尾放置一个throw(std::exception)
,但这给了我一个警告,说"C++异常规范被忽略了,除非指示函数不是__declspec(nothrow)",我想这意味着编译器忽略了throw
,并像不存在一样继续进行。
我还尝试在声明末尾添加一个throw()
(括号中没有任何内容),但是—与我的期望相反—这意味着函数应该永远不会抛出任何东西:"函数假定不会抛出异常,但确实抛出了"。
Atm我使用throw(...)
在语法上指示函数可能抛出,因为这不会给我任何错误或警告。关于我如何通过语法来表示这一点,你还有其他建议吗?
您没有。异常说明符的意思不是"这是我可以抛出的东西",而是"如果抛出了除此之外的任何东西,请转到std::terminate
"。这种行为违反直觉,以至于MSVC++不支持他们,也不会支持他们。
C++的语义是,你必须假设一个函数总是可以抛出。
当涉及到异常规范时,大多数编译器都不符合标准。异常规范被视为失败的实验
例如:
如果您有一个空白的异常规范,那么调用什么?CCD_ 6方法或CCD_?
#include "stdafx.h"
#include <stdio.h>
#include <exception>
#include <iostream>
using namespace std;
class A
{
public:
int i;
};
void myunexpected ()
{
cerr << "unexpected calledn";
}
void doSomething(void) throw();
void doSomething(void) throw()
{
A obj;
obj.i= 100;
throw obj;
}
int _tmain(int argc, _TCHAR* argv[])
{
set_unexpected (myunexpected);
try
{
doSomething();
}
catch (bad_exception be)
{
puts("Caught something");
}
catch (A &obj)
{
puts("Caught Integer");
}
return 0;
}
如果您在Visual studio上运行此代码,您将看到异常只是被适当的处理程序捕获。
总之,异常规范是一个失败的实验,最好避免它们。
基本上,throw
说明符毫无价值,正如在引入它们之后发现的那样,不幸的是,当前的编译器忽略了它们。它们已被弃用,并且高质量的库不包括它们。只是不要麻烦他们。C++0x正式反对它们,并且只有一个noexcept
关键字。
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 具有所表示类的相同构造函数签名的代理类模板
- 函数名称表示什么等等
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- 你如何决定将C++和/或 python 中的成员函数表示为静态?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 未定义的引用(但 nm 表示该函数存在)
- 表示行为与复制代码块的函数参数?
- 删除类复制构造函数时,不能使用使用等号表示法的类构造函数
- 默认构造函数是否表示C 中的通用类型的零
- Clang 和 GCC 在使用大括号表示法和initializer_list时在构造函数选择上存在分歧
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 如何从LLVM的中间表示中获取在程序的每个函数中执行的函数调用列表
- 类方法接受表示各种参数数函数的 lambda
- 您可以在char数组中表示函数吗?
- 我可以使用函数表示运算符#()来调用内置类型的运算符吗
- visual Basic c++构造函数表示法
- c++使用一个函数表示多个变量.只有第一次运行有效
- Unique_ptr析构函数表示对象从未被分配过
- 逻辑错误:平均质心计算不正确,无限执行,'entries '函数 - K 表示一组点的聚类,以C++为单位