【问题标题】:C4297 warning in Visual Studio while using function-try-block (function assumed not to throw an exception but does)使用 function-try-block 时 Visual Studio 中的 C4297 警告(假定函数不会引发异常,但会引发异常)
【发布时间】:2020-07-30 15:10:53
【问题描述】:
#include <exception>

struct FOO
{
  ~FOO() try
  {
    throw std::exception();
  }
  catch (...)
  {
    return; // Shall prevent the exception from being rethrown?
  }
};

在 Visual Studio 中构建此代码会触发 C4297 警告(假定函数不会引发异常,但会引发异常)。

到达析构函数上函数try块的catch子句的末尾也会自动重新抛出当前异常,就像通过throw;,但允许返回语句quoted from cppreference.com;

我能正确解释这句话吗?从 catch 语句中返回是否应该防止异常被重新抛出?

我记录了bug,但他们将其关闭为duplicate。另一个错误没有return statement,但我认为它会有所不同。

Live example

【问题讨论】:

    标签: c++ exception language-lawyer


    【解决方案1】:

    我能正确解释这句话吗?从 catch 语句中返回是否应该防止异常被重新抛出?

    我相信你是。一方面,明确规定在构造函数中,函数try块的处理程序可能不包含return语句。

    [except.handle]

    13 如果 return 语句出现在 构造函数的function-try-block,程序格式错误。

    显式退出此类处理程序的唯一方法是抛出另一个异常。不允许使用 return 语句,因为它会吞下异常。当我们隐式地离开一个处理程序时,通过结束的流动

    14当前处理的异常在控制到达时重新抛出 构造函数的函数尝试块的处理程序的结尾或 析构函数。否则,从复合语句的末尾流出 function-try-block 的处理程序相当于流出 该函数的复合语句的结尾(参见 [stmt.return])。

    [stmt.return] 中的位表示到达 void 返回函数的右大括号相当于末尾的 return;。所以第一句话告诉我们,在析构函数的函数try-block的处理程序中,结束的流动不是return;,它重新抛出。那里没有隐式返回。

    这只留下了明确返回的结论,由于不被禁止,必须吞下当前的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2020-06-05
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多