C ++ try / catch与C setjmp / longjmp有什么不同?

时间:2013-02-16 20:16:32

标签: c++ c error-handling longjmp setjmp

我了解C++使用trycatch块的异常处理。我想知道C中是否存在此功能。所以,现在我知道C中的基本错误处理是由setjmp/longjmp完成的。

由于setjmp/longjmp中不存在C++,可以假设try/catch更好吗?以什么方式???

我可以使用try/catchC中实现setjmp/longjmp功能。 那有什么不同?

5 个答案:

答案 0 :(得分:4)

我认为主要区别在于try / catch能够识别堆栈中的对象并知道如何为堆栈上分配的对象调用dtors,setjmp对此无效。

此外,用户界面更丰富,你可以定义几种异常类型,并根据它们的行为不同

答案 1 :(得分:4)

try / catch将占RAII。离开范围的所有对象都将被正确销毁。

setjmp / longjmp不会。

答案 2 :(得分:2)

尽管RAII等语言功能缺失,但setjmp/longjmp与用于抛出/捕获异常的机制根本不同。目前,使用零成本方法处理异常,当且仅当实际抛出异常时才会遇到开销,否则就没有开销。由于假设在良好的应用程序中通常不会抛出异常,因此将其称为“零成本”。使用setjmp / longjmp,您将在每次“输入try块”时设置跳转点/上下文。因此,设置跳转点会有很多运行时开销。回到一天之后,使用setjmp/longjmp(由编译器,RAII和其他人称之为“缺失”的所有其他内容)实现了例外 - 所以你可以看到为什么他们的答案不完全正确),所以理论上你可以达到同样的效果,但在性能方面会更差。有关异常处理实现的更多详细信息,请参阅Itanium C++ ABI: Exception Handling

答案 3 :(得分:0)

虽然setjmp/longjmp可能会或可能不会处理析构函数,但这不是设计角度的重要区别。重要的是,当你抛出异常时,你不知道或不关心它将在何处处理。该实现遍历调用堆栈,直到找到一个可以处理抛出类型的catch子句,或者直到它到达堆栈顶部;在后一种情况下,程序会中止。

答案 4 :(得分:-2)

  

我可以使用setjmp / longjmp在C中实现try / catch / finally功能。那有什么不同?

这就是问题的答案(你不必亲自去做)。