-1

例外を処理してから、例外がスローされたコードの次の行に移動する方法はありますか?

例:

try {
    cout << "Test Begin! 1... 2... 3..." << endl;
    throw "A text!";
    throw 1;
    throw 2;
    throw 3;
    cout << "Yeah! Successful!!" << endl;
} catch (char* text) {
    cout << ch << endl;
    ???(); //Go back to the previous line
}
catch (int i) {
    cout << "Thrown " << i << endl;
    ???(); //Go back to the previous line
}

出力は次のようになります。

Test Begin! 1... 2... 3...
A text!
Thrown 1
Thrown 2
Thrown 3
Yeah! Successful!!
4

4 に答える 4

2

これは、例外が機能する方法ではありません。例外は、スローされた関数から効果的に「戻り」(「終了」のように)し、ローカルに割り当てられたメモリをクリーンアップします。tryそれはブロック内のユニークなイベントであり、それを回避する方法はありません。

私が言おうとしているのは、あなたのデザインはおそらくC ++の例外には適していないということです。問題を解決したい方法で言語を機能させるのではなく、C++で問題を解決する方法を再考する必要があります。最終的には、間違いなくよりクリーンなコードになります。

throwing関数の呼び出しをtry/で囲むと、呼び出しスタックを保持できますcatch。これにより、その1つの関数呼び出しのみが巻き戻され、残りの呼び出しスタックはそのまま残ります。

于 2012-10-20T20:24:23.470 に答える
1

longjmpと#define:

#include <setjmp.h>
#include <iostream>

#define THROW_AND_GO_NEXT(action) \
  val=setjmp(env); \
  if (val==0) \
    action; 


using namespace std;

int main()
{
  jmp_buf env;
  int val;

  try {
      cout << "Test Begin! 1... 2... 3..." << endl;
      THROW_AND_GO_NEXT(throw "A text!");
      THROW_AND_GO_NEXT (throw 1);
      THROW_AND_GO_NEXT(throw 2);
      THROW_AND_GO_NEXT(throw 3);
      cout << "Yeah! Successful!!" << endl;
  } catch (const char* text) {
      cout << text << endl;
      longjmp(env,1);
  }
  catch (int i) {
      cout << "Thrown " << i << endl;
      longjmp(env,1);
  }
  return 0;
}

これは出力です:

>./a
Test Begin! 1... 2... 3...
A text!
Thrown 1
Thrown 2
Thrown 3
Yeah! Successful!!
于 2012-10-20T20:31:02.973 に答える
1

1つの解決策は、各入力で例外を処理し、各ステートメントで同じものを使用する関数を作成することだと思います。

   cout << "Test Begin! 1... 2... 3..." << endl;
   handleException(A text!);
   handleException(1);
   handleException(2);
   handleException(3);
   cout << "Yeah! Successful!!" << endl;

これがCUSTOM関数であり、以下handleExceptionのような例外処理があります(単なる例)

   void handleException(int input){
      try {
           thrown input;
         }catch (int i) {
            cout << "Thrown " << i << endl;
         }
     }


   void handleException(char* input){
      try {
           thrown input;
         }catch (char* text) {
            cout << "Thrown " << text << endl;
         }
     }
于 2012-10-20T20:18:34.330 に答える
1

いいえ。要求しているのは再開可能例外と呼ばれ、catch句でプログラムにスローの時点で再開するように指示できます。これは、おそらくcatch句のコードで問題が修正されたためです。C ++は、再開可能な例外をサポートしていません。決してしなかった、決してしません。<g>

于 2012-10-20T21:40:07.553 に答える