对于混合的非托管和托管C ++代码,我们需要使用/ EHa异常处理进行编译吗?什么是默认值?

时间:2016-09-21 16:31:40

标签: c++ exception-handling seh

我们有一个混合/clr(托管)代码和非托管代码的进程,我们正在尝试确定要使用的异常处理模型。我想我们(可能?)需要使用/EHa。现在我们指定<ExceptionHandling>Async</ExceptionHandling>,这与在我们的C ++项目文件中使用/EHa进行编译相同。这样我们就可以捕获所有异常,包括结构化异常,并将所有异常视为顶级catch(...)块中的致命异常(因为它们可能是访问冲突或其他会导致程序进入未定义状态的事物)。 p>

我很困惑阅读/EH (Exception Handling Model),特别是:

  

/ EHa编译器选项用于支持异步结构化   带有本机C ++ catch(...)子句的异常处理(SEH)。至   实现SEH而不指定/ EHa,你可以使用__try,   __except和__finally语法。虽然Windows和Visual C ++支持SEH,但我们强烈建议您使用ISO标准C ++   异常处理(/ EHs或/ EHsc),因为它使代码更具可移植性   而且灵活。然而,在现有代码或特定种类中   程序 - 例如,在编译为支持公共的代码中   语言运行时(/ clr(公共语言运行时编译)) - 你   仍然可能必须使用SEH。有关更多信息,请参阅结构化   异常处理(C / C ++)。

这表示我们可能必须使用/EHa。然后我走到页面顶部,试图弄清楚默认的异常处理模型是什么(如果它等同于/EHa),我不确定......它看起来非常相似但是那里略有不同的描述,默认的异常处理模型描述为:

  

如果未指定/ EH,编译器将捕获两个异步   结构化异常和C ++异常,但不破坏C ++   由于异步异常而超出范围的对象。

我们是否需要指定/ EHa,因为我们有混合托管(/clr)和非托管代码,这些代码必须在异常处理期间的某个时间点进行通信?

VS2015中C ++项目的默认异常处理模型是否等同于/EHa

0 个答案:

没有答案