写C代码的时候有时候异常处理的代码甚至比程序需要的逻辑代码还多,因为异常处理很重要。一般异常处理使用 if 判断进行处理即可,也是非常直观、高效的。不过显然类似于C++、Java或者SEH那样的异常处理机制更加优雅,有利于他人阅读程序。
在一个函数内,我们可以使用goto来实现异常处理。例如:
int main(){
if (operation1() == 1){
if (operation2() == 2){
operation3();
goto exit;
}else{
goto errHandler;
}
}else{
goto errHandler;
}
errHandler:
printf("error");
exit:
return 0;
}
如果不是在一个函数内,则需要使用C的库函数setjmp和longjmp来进行处理。
jmp_buf jmpBuf;
int main2(){
int setjmpRetValue = setjmp(jmpBuf);
if (setjmpRetValue == 0){
if (errorOccurred() == 1){
longjmp(jmpBuf, 2);
}
}else if (setjmpRetValue == 2){
printf("error");
}
return 0;
}
jmp_buf是一个16字节数组类型的变量,用来保存栈帧上下文。setjmp 函数保存上下文到 jmpBuf 中,第一次返回时返回总是返回0,此时我们继续执行需要执行的代码。当发生错误的时候,我们调用 longjmp,恢复 jmpBuf ,于是回到了 setjmp 函数中,并返回 longjmp 传入的第二个参数。根据这个参数判断是哪里出现了错误,从而在同一个地方进行所有异常的处理操作。
有一点要说明。
您可能觉得,Java的异常是自动抛出的,比上述方法更方便。Java的异常也不是自动抛出的,只是那些抛出异常的代码是别人写的,是写Java库的程序员编写的。