c++ 从catch块中的函数重新引发

carvr3hs  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(186)

在这种情况下,我想根据抛出的异常执行一些操作,然后重新抛出异常。推荐这样做吗?我的目标是根据抛出的异常做一些工作,然后重新抛出它,让应用程序崩溃并生成转储,其中包含异常中的调用堆栈。

class Foo
{
public:

void HandleException(const std::exception& ex)
{
    // Log, report some metrics
    throw;
}

void Work(//Some inputs)
{
     try
     {
          // trying doing some work
     }
     catch (const std::exception& ex)
     {
          // This is really an exceptional situation, and the exception should be thrown which  
          // cause the exe to abort and create dump.
          // Intention is to preserve call stack and have it in dump.
          HandleException(ex);
     }
}
}

让我再补充一点:当我把HandleException作为一个lambda函数时,在lambda中抛出会导致异常。我需要捕获一些状态吗?我该怎么做?

iecba09b

iecba09b1#

捕获异常时,您有两个选择:

  • 以某种方式实现最初的目标(合同),例如通过重试。
  • 通过投掷报告失败。

实现第二个要点的一种方法是重新引发原始异常。

des4xlb0

des4xlb02#

是的,这是有效的。这也是危险的。
如果你调用throw;时没有参数,并且当前没有异常,这将导致调用std::terminate()。当前代码的问题是任何人都可以调用该函数,即使他们不在catch块中(这将导致终止)。
因此,您可能需要验证异常是否正在传播:

void HandleException(const std::exception& ex)
{
    // Log, report some metrics
    if (std::uncaught_exception()) {
        throw;
    }
    // Maybe put an else here.
}

还值得一阅读:GotW #47: Uncaught Exceptions

相关问题