【问题标题】:throw () after function declaration in c++ exception struct?在c ++异常结构中的函数声明后抛出()?
【发布时间】:2014-04-16 16:05:36
【问题描述】:

这里来自http://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm

#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception
{
  const char * what () const throw ()
  {
    return "C++ Exception";
  }
};

我理解const 在what 之后的意思是该函数没有修改任何 结构体的成员,但最后的throw() 是什么意思?

【问题讨论】:

  • 切向:给定“C++ 异常”是函数本地的并且具有自动存储功能,如果内存不足,what() 会抛出 std::badalloc 吗?
  • @rjfalconer 为什么你认为它有自动存储?未命名的指针返回值可以,但是数组呢?
  • 啊,是的。我忽略了返回类型。那么同样的问题,但对于任何使用自动存储的任意示例:这会禁止使用这样的异常说明符吗?

标签: c++ exception struct


【解决方案1】:

这意味着它不会抛出任何异常。这对于像what 这样的函数来说是一个重要的保证,它通常在异常处理中调用:你不希望在尝试处理一个异常时抛出另一个异常。

在 C++11 中,您通常应该改用 noexcept。旧的 throw 规范已弃用。

【讨论】:

    【解决方案2】:

    throw () 是一个异常说明符,它声明what() 永远不会抛出异常。然而,这在 C++11 中已被弃用(参见 http://en.wikipedia.org/wiki/C++11)。要指定函数不抛出任何异常,C++11 中存在 noexcept 关键字。

    【讨论】:

      【解决方案3】:

      你可以指定被抛出的类型,这样如果它抛出任何东西 但是那个类型(例如int),然后函数调用std::unexpected 而不是寻找处理程序或调用std::terminate。

      在这种情况下,它不会抛出任何异常,这对于 what().

      如果这个 throw 说明符为空且没有类型,这意味着 任何异常都会调用std::unexpected。没有 throw 的函数 说明符(常规函数)从不调用 std::unexpected,但遵循 寻找异常处理程序的正常路径。

      这称为动态异常规范,在 旧代码。它被认为已弃用。

      请看这里:http://www.cplusplus.com/doc/tutorial/exceptions/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 2013-03-28
        • 2019-03-11
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多