C++:表示函数可能抛出

C++: Indicating a function may throw

本文关键字:函数 表示 C++      更新时间:2023-10-16

可能重复:
有没有一个公认的习语可以用来指示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关键字。