神奇的C语言五:异常处理

写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库的程序员编写的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值