通过函数的返回值表示错误,之前已经大量使用过这种方法。这种方法因为有return,函数的右括号会被执行,对象可以正确地被析构。但是这种方法需要层层判断返回值,流程非常繁琐。在UnixC的源代码中,经常是返回值判断的代码比运行的代码还要多。
通过setjmp/longjmp远程跳转。C中的函数,一般是调用一次返回一次,而setjmp比较特殊,是调用一次,返回两次。longjmp也比较特别,是从一个函数是调用,而从另一个函数里返回。这两个函数相互配合,构成远程跳转,实现C中的错误集中处理。第一次调用setjmp时,会将进入函数时的环境信息,包括系统堆栈保存到一个jmp_buf缓冲区中,并返回0。进程继续。调用longjmp时会将保存的调用栈恢复到当前调用栈,将返回一个非0的数字,这个非0的数据就是setjmp的第2次返回值。(因为setjmp第1次返回0,故longjmp不能返回0)。这种方法不用逐层判断返回值,并能集中处理错误,使流程简化。这种方法在C中比较适用。而在C++中,因为longjmp从setjmp中返回,调用函数的右花括号不会被执行,调用函数中的局部变量的析构函数都不会被执行。
C++中的异常处理,集中了以上两种方式的优点,既能集中处理错误,避免层层判断,也能保存局部变量被析构。