【问题标题】:C++ std::exception between Libraries库之间的 C++ std::exception
【发布时间】:2014-11-05 15:39:00
【问题描述】:

当我在库中抛出异常时,调用者不会捕获该异常。

为了说明,如果我在静态库中有这个函数:

#include <exception>

void TestClass::ThrowException()
{
   throw new std::exception();
}

...然后从可执行文件中调用它:

TestClass t;
try
{
   t.ThrowException();
}
catch (std::exception e)
{
}
catch (...)
{
}

... 这是第二个 catch 收到异常,而不是第一个,这是我没想到的。我怀疑库之间存在一些我不知道的编组,这导致无法识别异常类型。

是否可以在两个二进制文件之间传递异常,以便调用者将其识别为“std::exception”?作为第二个问题,这是个好主意吗?

我的目标是 Windows,使用 Visual Studio。

【问题讨论】:

  • 我来自托管 (C#) 背景,因此我很想更深入地了解这里发生了什么,以及 C++ 中的“最佳实践#”是什么。
  • 试试catch(std::exception&amp; e)而不是catch(std::exception e)
  • 再看一遍,你throw new 这将是一个指针。见How to throw a C++ exception。换句话说,你在 C# 中使用 new 的很多地方,在 C++ 中你不会这样做。
  • @Arkady:是吗?只要他们共享运行时库,一切都很好。
  • 扔出静态链接库是可以的。

标签: c++ visual-studio exception c++-standard-library


【解决方案1】:
throw new std::exception();

您正在抛出您在堆上创建的异常,因此您需要将其作为指针捕获:

catch (std::exception *e)

但是永远不要这样做(您将不知道在哪里删除分配的内存)。而是将一个对象扔到堆栈上:

throw std::exception();

最后一点。不要按价值捕获,按引用捕获。这是因为当您以后对异常进行子类化时,您不会对它们进行切片。如果您想通过 const 引用完全正确地捕获:

catch (const std::exception& e)

如果您不熟悉所有这些推荐读物,请阅读《Effective C++》,它是 Scott Meyers 的续集。

【讨论】:

  • 感谢您的明确回答,也推荐阅读。事实证明,我对如何在 C++ 中引发异常的理解有些离谱。
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 2020-07-26
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多