【问题标题】:about c++ exceptions. func() throw()关于 c++ 异常。函数()抛出()
【发布时间】:2009-03-02 22:39:29
【问题描述】:

我正在阅读此页面http://www.cplusplus.com/doc/tutorial/exceptions.html 它说如果我写 function() throw();该函数中不能抛出异常。我尝试在 msvc 2005 中编写 throw()、throw(int)、throw(),但什么也没有。每个都有完全相同的结果。没有什么。我扔了 int, char*, 另一种类型,它们都以相同的方式被捕获。看起来 throw 根本不影响它。 function() throw() 究竟做了什么?

【问题讨论】:

    标签: c++ exception throw


    【解决方案1】:

    有关 C++ 异常规范和 Microsoft 实现的详细信息,请参阅 this article

    Microsoft Visual C++ 7.1 忽略异常规范,除非它们为空。空异常规范相当于__declspec(nothrow),可以帮助编译器减少代码大小。

    [...] 如果它看到一个空的异常规范,它将假定您知道自己在做什么,并优化处理异常的机制。如果你的函数无论如何都会抛出 - 好吧,你感到羞耻。仅当您 100% 确定您的函数不会抛出并且永远不会抛出时,才使用此功能。

    【讨论】:

    • 这与标准所说的非常不同......我想还有一个理由不使用它们
    【解决方案2】:

    您发现该版本的 VC++ 没有强制规范异常。我相信这被记录为与标准的差异。

    但是,异常规范通常不是一个好主意。如果程序在符合标准的实现中违反了它们(VS 2005 中的 VC++ 在这种情况下不存在),系统应该会捕获它。这意味着规范不是编译器优化提示,而是强制编译器花费额外的长度,有时会产生次优代码。

    请参阅the Boost rationale,了解备受推崇的 Boost 项目不使用异常规范的原因。这就是 Boost,它是用语言的高级部分做奇怪而有用的事情的典型代表。

    【讨论】:

      【解决方案3】:

      引用A Pragmatic Look at Exception Specifications:

      (错误)理解

      第二个问题与 知道你得到了什么。尽可能多 包括作者在内的知名人士 Boost 异常规范 理由,已经说过了, 程序员倾向于使用异常 规范就像他们表现得一样 程序员想要的方式, 而不是他们实际做的方式 行为。

      这就是很多人的想法 异常规范:

      • 保证函数只会抛出列出的异常(可能 无)。

      • 根据仅列出的知识启用编译器优化 例外(可能没有)将是 扔了。

      上述期望再次是, 看似接近正确。

      查看链接了解完整详情。

      【讨论】:

        【解决方案4】:

        抛出异常是不够的,你需要一个try {} catch() 块来捕获异常。如果你没有捕捉到异常,std::terminate() 会被调用并且你的程序会突然退出。花点时间去this

        【讨论】:

        • 这不是他要问的。
        【解决方案5】:

        投掷规格有两个目的:

        1. 作为接口实现和接口用户之间的契约——你声明可以从你的方法中抛出哪些异常,有些人认为它是接口的一部分。 (合同)Ala 检查了 Java 中的异常。

        2. 作为向编译器发出信号的一种方式,它可以应用某些优化,以防无法从方法/过程中引发异常(设置异常处理需要一些成本)

        抛出未在 throw() 子句中指定的异常是错误的,但是在任何时候都不需要实现来为您验证它。事实上,它甚至无法验证,因为它包含了子程序调用的所有可能的异常。 (可能来自其他模块)在单个模块中甚至不可能,因为很容易减少到停止问题:)

        【讨论】:

        • 对于 C++ 完全不正确。异常规范需要在运行时检查,一般不允许优化。
        • 这不是我的意思。它们不需要在 COMPILE-TIME 中检查。它们还允许在没有例外的情况下进行优化(恕我直言,C++ 语言常见问题解答提到了它)。所以你投反对票是不正确的。
        猜你喜欢
        • 2014-11-03
        • 2011-01-22
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 2022-01-16
        相关资源
        最近更新 更多