C 中的异常处理 - 使 try 捕获跨函数工作



我正在用 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 库,该库已为此目的而设计、构建和测试。