我了解C++
使用try
和catch
块的异常处理。我想知道C
中是否存在此功能。所以,现在我知道C
中的基本错误处理是由setjmp/longjmp
完成的。
由于setjmp/longjmp
中不存在C++
,可以假设try/catch
更好吗?以什么方式???
我可以使用try/catch
在C
中实现setjmp/longjmp
功能。
那有什么不同?
答案 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功能。那有什么不同?
这就是问题的答案(你不必亲自去做)。