什么是更好的使用,__try / __除块或try / catch块?
我想知道哪种方法可以捕获我抛出的exception:它是__try / __except块还是try / catch块?
我用C ++编写,程序只能在Windows上使用,因此可移植性不是问题。
谢谢!
你应该使用try
/ catch
块。
正如其他人已经回答的那样, __try
try / __except
用于捕获SEH(窗口生成的错误),而不是用于捕获一般exception。
最重要的是, __catch
和__catch
可能无法运行C ++析构函数或在抛出exception时正确展开堆栈。
除极少数情况外,您绝不应该尝试捕获SEH例外。
编辑:嗯,我对此持肯定态度(这是我一直被告知的),但是@Hans说显然有一个编译器开关可以用来改变它。 我认为/EHa
上的文档对这里发生的事情有误导性,或者至少是不完整的。 如果有人找到certificate这个错误的明确文档,我会很乐意删除这个答案。
即使事实certificate这是错误的,你仍然应该使用try
和catch
只是因为它们是标准的,而__try
和__except
则不是。
它们是两个非常不同的东西。 try / catch是您熟悉的熟悉的C ++关键字。 __try/__except
用于捕获SEHexception。 Windows自身引发的exception,例如DivisionByZero或AccessViolation。 它在MSDN Library文章中有详细描述。
您还可以使用它来捕获C ++exception,因为它利用了Windows SEHfunction。 但是,您无法从中获取抛出的exception对象,因此如果您确实希望处理exception,则将没有上下文。 哪个是疯了。 头号方法是永远不会捕获SEH例外,它们总是很严重。 如果确实需要将两者结合,则使用_set_se_translator()将SEHexception转换为C ++exception。
__try/__except
用于调用Win32 C代码,该代码不支持exception但使用结构化错误代码/处理机制。 __try/__except
会将C错误转换为类似于 C ++ try / catch的exception块。
有关详细信息,请参阅此MSDN文章 。
标准C ++使用try / catch块,因此如果您需要基于标准C ++库的“标准”exception机制,我建议使用它们。
但是,如果您计划使用通过Windows SDK提供的结构化exception处理(请参阅此处 ),请使用__try
/ __except
。
一旦你抛出一些东西,你就不再有太多选择如何抓住它。 如果抛出C ++exception(即使用throw
),则使用try
/ catch
。 如果抛出Windowsexception(即使用RaiseException
),则使用__try
/ __except
。 试图混合它们只会给你的生活带来不必要的麻烦。