之前看lua源码,看到LUAI_TRY没当回事,以为就是直接调用。
今天细细调查后发现还真是学到了新玩意儿。照猫画瓢写了一个小例子。
费话不多说,show you the code.
#include <stdio.h>
#include <setjmp.h>
#define DECLARE_TRY_CATCH() jmp_buf gJmpBuf; int gSetjmpRet = 0
#define TRY(foo) if((gSetjmpRet = setjmp(gJmpBuf)) == 0) {foo;}
#define CATCH() switch(gSetjmpRet)
#define THROW(errNo) longjmp(gJmpBuf, errNo)
DECLARE_TRY_CATCH();
void sub(errNo) {
printf("in sub function. do something...\r\n");
THROW(errNo);
printf("after throw will be never outputed!\r\n");
}
void second(void) {
printf("start second\r\n");
sub(2);
printf("end second\r\n");
}
void first(void) {
printf("start first\r\n");
sub(1);
printf("end first\r\n");
}
int main() {
TRY(first());
CATCH() {
case 1:
printf("catch err1, when call first\r\n");
break;
case 2:
printf("catch err2, when call first\r\n");
break;
default:
printf("catch unknown, when call first\r\n");
break;
}
TRY(second());
CATCH() {
case 1:
printf("catch err1, when call second\r\n");
break;
case 2:
printf("catch err2, when call second\r\n");
break;
default:
printf("catch unknown, when call second\r\n");
break;
}
return 0;
}
运行结果
start first
in sub function. do something...
catch err1, when call first
start second
in sub function. do something...
catch err2, when call second