【问题标题】:C++ Do I need to write throw clause for a function everywhere?C++ 我是否需要在任何地方为函数编写 throw 子句?
【发布时间】:2012-06-29 08:48:41
【问题描述】:

之前

考虑拥有一个类和一个全局函数:

例如,usefulfuncts.hpp

void dosome(int a, int b) throw (std::exception);

这是usefulfuncts.cpp

void dosome(int a, int b) throw (std::exception) {
   //...
}

这是aclass.hpp

class aclass {
   // Members...
   friend void dosome(int a, int b) throw (std::exception);
   // Members...
};

之后(我想要的)

好的!我想了解是否有必要每次都写 throw 子句。那么例如我可以这样做吗?

这是usefulfuncts.hpp

void dosome(int a, int b) throw (std::exception);

这是usefulfuncts.cpp

void dosome(int a, int b) { /* OMITTING IT! */
   //...
}

这是aclass.hpp

class aclass {
   // Members...
   friend void dosome(int a, int b); /* OMITTING IT */
   // Members...
};

这是对的吗?仅将其放在主要声明中?谢谢

【问题讨论】:

    标签: c++ exception exception-handling declaration


    【解决方案1】:

    省略异常规范意味着您的函数可以抛出任何异常。

    异常规范不好。几乎没有任何编译器可以正确实现该功能。自 C++11 标准以来,它们已被弃用。事实上,异常规范被认为是失败的实验,即使它们是 C++03 标准的一部分。

    好读:
    A Pragmatic Look at Exception Specifications

    【讨论】:

    • 是的,但如果我只指定一次,它会引发一个异常,而在其他情况下,为了避免重复,我没有指定它......会发生什么???
    • 使用它们。只是不要指定它们。
    • @Andry:这里的答案是专门讨论“异常规范”而不是“异常”。你应该使用异常。在某些情况下,它们是最好的方法(失败的构造函数)。请阅读 Herb 的链接文章,它会让您很好地了解为什么异常规范被认为是邪恶的。
    • @Andry 你应该使用异常,而不是异常规范。
    • OK wua,完全没有意识到...谢谢大家...我稍后会检查正确,因为我不能在七分钟之前...我现在得走了,我会检查你的答案稍后再见:)
    【解决方案2】:

    声明异常是个坏主意。来自http://www.gotw.ca/publications/mill22.htm

    道德 #1:永远不要编写异常规范。
    道德#2:除了可能是空的,但如果我是你,我什至会避免这样做。

    【讨论】:

      【解决方案3】:

      Exception specifications are deprecated in C++11 - 不要编写异常规范,除非要指定保证您的函数不会抛出异常。

      请注意,实际上提供此保证比看起来更难 - Herb Sutter 曾就异常和异常安全的主题写过 many articlesa book

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2018-03-20
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        相关资源
        最近更新 更多