Vector异常处理程序是否处理不同线程中的所有异常,包括C++异常?

5us2dqdw  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(171)

接上一个问题:How to handle SEH exception on a global level
Vector异常处理程序是否捕获所有异常,包括C异常?微软的文档说它是SEH处理程序的扩展,但我在某个地方读到,不可能全局捕获不同线程中的所有c异常,因为它们有自己的堆栈,哪一个是正确的?

v2g6jxz6

v2g6jxz61#

我觉得你有点搞反了。
使用Microsoft的编译器,您可以将结构化异常转换为C异常,并捕获它们(但至少根据我的经验,这在实践中并不是特别有用)。
我还没有用向量异常测试过,但它们足够相似,我猜你可能也可以用它们做同样的事情(但我希望同样没有好的结果)。
我不知道有什么能让你走另一个方向。如果你愿意,你可以用结构化异常来实现C
异常。由于向量异常是结构化异常的扩展,因此您也可以根据向量异常来实现C++异常。
但是不能保证任何特定的编译器实际上会这样做。微软确实曾经做过,但我一点也不清楚他们是否还会做更多的事情。例如,编译器有两个开关:

/EHs enable C++ EH (no SEH exceptions)  /EHa enable C++ EH (w/ SEH exceptions)

也许/EHs仍然可以在内部使用SEH,只是不在用户级别提供它们,但这一点也不确定。我似乎有一个模糊的记忆,它没有,但我一点也不确定。
gcc和clang现在至少对SEH(可能还有VEH)提供了一些支持,但至少在我上次查看时,它们在实现C++异常时并不依赖于这两个。
底线是:我怀疑是否有人真的能保证你想要的东西能正常工作,所以你能希望的最好的结果就是测试,也许它能用一些特定的编译器和标志为你关心的代码工作。但最好的情况是,它可能相当脆弱--编译器中一个看似很小的更改,甚至只是一个标志都可能破坏它。

相关问题