3

C++我知道使用tryandcatch块时的异常处理。我想知道这个功能是否存在于C. 所以,现在我知道基本的错误处理C是由setjmp/longjmp.

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

我可以在using中实现一个try/catch功能。那有什么不同??Csetjmp/longjmp

4

5 回答 5

4

我认为主要区别在于 try/catch 知道堆栈上的对象,并且知道如何为堆栈上分配的对象调用 dtor,而 setjmp 对此没有任何作用。

此外,用户界面更加丰富,您可以定义多种异常类型并根据这些类型进行不同的行为

于 2013-02-16T20:24:49.120 回答
4

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

setjmp/longjmp不会。

于 2013-02-16T20:25:13.630 回答
2

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

于 2013-02-16T20:50:14.843 回答
0

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

于 2013-02-16T21:40:41.680 回答
-2

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

这就是问题的答案(您不必自己做)。

于 2013-02-16T20:23:07.017 回答