c - C 中的异常处理 - 使 try catch 跨函数工作

标签 c exception try-catch setjmp

我正在用 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 block 内部调用的方法内部抛出异常,因为 jmp_buf 变量是本地变量。我怎样才能做到这一点? 我想到了一个全局变量,但这不允许我嵌套 try catch block 。

最佳答案

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

不过,一般来说,我根本不推荐这种方法。尝试将功能改进到一种语言中充满了危险,其中最重要的是以下代码:

for ;; { 
  TRY {
    if (someVar) {
      break;
    }
  }
  FINALLY {
    doIt()
  }
  ETRY
}

关于c - C 中的异常处理 - 使 try catch 跨函数工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22095989/

相关文章:

c - R 将函数 Realoc 与 .C 接口(interface)一起使用

android - 多个数据报告实用程序可以报告同一个未捕获的异常吗?

c# - 打印到基于非 xps 的打印机时 PrintQueue.AddJob 挂起

c++ - 尝试抛出异常处理

.net - .NET 中的 Try-Catch-Continue

java - 在 try block 内,FileIStream 变量可能尚未初始化错误

c - 在定点计算中使用小数部分

c - 以二进制方式打开文件进行处理

c - 输入整数不会因非整数而停止

ruby-on-rails - ruby 类和同名模块之间有什么关系?