1

重複の可能性:
ANTICは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

私はこれに 2 セント投入します。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 に答える