【发布时间】: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& e)而不是catch(std::exception e) -
再看一遍,你
throw new这将是一个指针。见How to throw a C++ exception。换句话说,你在 C# 中使用new的很多地方,在 C++ 中你不会这样做。 -
@Arkady:是吗?只要他们共享运行时库,一切都很好。
-
扔出静态链接库是可以的。
标签: c++ visual-studio exception c++-standard-library