1

可能重复:
ANSI C 等效于 try/catch?

有没有办法跳过关键代码?或多或少类似于现代编程语言中的 try-catch。刚才我正在使用这种技术来发现错误:

bindSignals();
{
    signal(SIGFPE, sigint_handler);
    // ...
}

int main(void)
{
    bindsignals();
    int a = 1 / 0; // division by zero, I want to skip it
    return 0;
}

问题是如果我不退出处理程序中的程序,我会一次又一次地得到同样的错误。如果可能的话,我想避免goto。我也听说过“跳远”什么的。值得(学习)使用吗?

4

3 回答 3

3

好吧,您可能可以使用 来完成类似的事情longjmp(),是的。

可能在某些宏的“帮助”下。但是请注意手册页上的注释:

longjmp()并使siglongjmp()程序难以理解和维护。如果可能,应使用替代方案。

于 2013-01-16T13:21:44.673 回答
0

我会为此投入两分钱。C 没有其他语言支持的 try/catch 之类的机制。setjmp()您可以使用类似的东西来构建一些东西longjmp(),但没有完全相同的东西。

这是一个链接,显示了一种很好的使用方式setjmplongjmp做你想做的事情;以及来自同一来源的代码片段:

   jmp_buf jumper;

   int SomeFunction(int a, int b)
   {
      if (b == 0) // can't divide by 0
         longjmp(jumper, -3);
      return a / b;
   }

   void main(void)
   {
      if (setjmp(jumper) == 0)
      {
         int Result = SomeFunction(7, 0);
         // continue working with Result
      }
      else
         printf("an error occured\n");
   }

我目前正在从 C 转到 Java,我很难理解为什么你首先要使用 try/catch。通过良好的错误检查,您应该没问题,始终始终使用从函数返回的值,检查错误值并验证任何用户输入。

于 2013-01-16T14:00:57.453 回答
0

我受够了。这就是我的代码现在的样子。几乎像 Java 和 C#。

#include <setjmp.h>

jmp_buf jumper;

#define try           if (setjmp(jumper) == 0)
#define catch         else
#define skip_to_catch longjmp(jumper, 0)

static void sigint_handler(int sig)
{
    skip_to_catch;
}

int main(void)
{
    // init error handling once at the beginning
    signal(SIGFPE,  sigint_handler);

    try
    {
        int a = 1 / 0;
    }
    catch
    {
        printf("hello error\n");
    }
    return 0;
}
于 2013-01-16T14:32:41.510 回答