使用 function-try-block 时 Visual Studio 中发出 C4297 警告(假定函数不会引发异常,但确实引发了异常)

Gil*_*ils 8 c++ exception language-lawyer

#include <exception>

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

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

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

我对这句话的理解正确吗?从 catch 语句返回是否可以防止异常被重新抛出?

我记录了一个错误,但他们将其作为重复项关闭。另一个错误没有,return statement但我认为这很重要。

实例

Sto*_*ica 4

我对这句话的理解正确吗?从 catch 语句返回是否可以防止异常被重新抛出?

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

[除了句柄]

13如果 return 语句出现在构造函数的函数 try 块的处理程序中,则程序格式错误。

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

14如果控制到达构造函数或析构函数的函数 try 块的处理程序末尾,则重新引发当前处理的异常。否则,从函数 try 块的处理程序的复合语句的末尾流出相当于从该函数的复合语句的末尾流出(请参阅 [stmt.return])。

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

只剩下一个结论:显式返回,由于不被禁止,必须吞掉当前的异常。