1

我正在用 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 块。

4

2 回答 2

4

您需要使用全局跳转缓冲区,因为它需要对您的“客户”可见。例如,您可以将旧的跳转缓冲区保存在 try 块中,并在使用后恢复它。

不过,总的来说,我根本不会推荐这种方法。试图将特性改造成一种语言是充满危险的,其中最重要的是以下代码:

for ;; { 
  TRY {
    if (someVar) {
      break;
    }
  }
  FINALLY {
    doIt()
  }
  ETRY
}
于 2014-02-28T13:11:52.747 回答
3

使用一堆jmp_buf's。或者更好的是,使用已为此目的设计、构建和测试的现有 CII 库。

于 2014-12-31T17:38:57.177 回答