相关疑难解决方法(0)

从析构函数中抛出异常

大多数人都说永远不会从析构函数中抛出异常 - 这样做会导致未定义的行为.Stroustrup指出"向量析构函数显式地为每个元素调用析构函数.这意味着如果元素析构函数抛出,向量破坏失败......实际上没有好的方法来防止从析构函数抛出的异常,所以库如果元素析构函数抛出",则不保证"(来自附录E3.2).

这篇文章似乎另有说法 - 抛出析构函数或多或少都没问题.

所以我的问题是 - 如果从析构函数抛出会导致未定义的行为,那么如何处理析构函数期间发生的错误?

如果在清理操作期间发生错误,您是否只是忽略它?如果它是一个可能在堆栈中处理但在析构函数中不正确的错误,那么从析构函数中抛出异常是否有意义?

显然,这类错误很少见,但可能.

c++ destructor exception raii

246
推荐指数
10
解决办法
11万
查看次数

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

#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但我认为这很重要。

实例

c++ exception language-lawyer

8
推荐指数
1
解决办法
1127
查看次数

标签 统计

c++ ×2

exception ×2

destructor ×1

language-lawyer ×1

raii ×1