我们有一个混合/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
?