我刚开始阅读这篇关于在 c 中使用 setjmp( jmp_buf ) 和 longjmp( jmp_buf, int ) 处理异常的文章。因此,我基本上构建了使用 xRecord 类型的局部变量的链接列表并将其链接到列表。(示例2)它工作得很好。但在示例 3 中,这些步骤被总结为宏(XTRY 和 XEND)。最让我恼火的是,示例 2 的实际 switch 语句只是在 3 中“消失”了。
示例 2:
#define DIVIDE_BY_ZERO -3
int SomeFunction(int a, int b)
{
if (b == 0) // can't divide by 0
XRaise(DIVIDE_BY_ZERO);
return a / b;
}
void main(void)
{
XRecord XData;
XLinkExceptionRecord(&XData);
switch (setjmp(XData.Context))
{
case 0: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO:
printf("a division by zero occurred\n");
break;
default:
printf("some other error occurred\n");
break;
case XFINALLY:
printf("cleaning up\n");
}
XUnLinkExceptionRecord(&XData);
}
示例 3:
void main(void)
{
XTRY
case XCODE: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO: // handler for a
specific exception
printf("a division by zero occurred\n");
break;
default: // default handler
printf("some other error occurred\n");
break;
case XFINALLY: // finally handler
printf("cleaning up\n");
XEND
}
我的问题是,如何构建这些“打开和关闭”宏?