我正在用 C 语言编写一个异常处理库,但我遇到了一个颠簸:
#define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0:
#define FINALLY break; } default:
#define CATCH(x) break; case x:
#define ETRY } }while(0)
#define THROW(x) longjmp(ex_buf__, x)
在我当前的 try catch throw 实现中,我将无法从从 try 块内部调用的方法内部抛出异常,因为 jmp_buf 变量是局部的。我怎样才能做到这一点?我想过一个全局变量,但这不允许我嵌套 try catch 块。
您需要使用全局跳转缓冲区,因为它需要对您的"客户端"可见。例如,您可以将旧的跳转缓冲区保存在 try 块中,并在使用后将其还原。
不过,总的来说,我根本不推荐这种方法。尝试将功能改造为一种语言充满了危险,其中最重要的是以下代码:
for ;; {
TRY {
if (someVar) {
break;
}
}
FINALLY {
doIt()
}
ETRY
}
使用一堆jmp_buf
。 或者更好的是,使用现有的 CII 库,该库已为此目的而设计、构建和测试。