5

C++/CI でプログラミングしていると、同じ関数を複数回呼び出すことになり、それらすべての呼び出しのエラーをチェックする最も効率的な方法は何だろうと考えていました。usingif elseステートメントは多くのコードを必要とし、見栄えも悪くなります。エラーをチェックする独自の方法を思いつきました。おそらく、使用すべきより良い方法があります。

int errs[5] = {0};
errs[0] = functiona(...);
errs[1] = functiona(...);
...
errs[5] = functiona(...);
for (int i = 0; i < 5; i++)
{
  if (err[i] == 0)
     MAYDAY!_wehaveanerror();
}

注:最初のエラーで例外をスローすることでこの問題を解決できるため、C++ ではtryandを使用catchする方がよいことは理解していますが、それに関する問題は、次のようなエラー コードを返す多くの関数と互換性がないことです。 Windows API。ありがとう!

4

5 に答える 5

5

次のような疑似 C++ を書くことができます。

struct my_exception : public std::exception {
    my_exception(int); /* ... */ };

int main()
{
    try
    {
        int e;
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
    }
    catch (my_exception & e)
    {
        std::cerr << "Something went wrong: " << e.what() << "\n";
    }
}
于 2012-04-14T23:48:11.340 に答える
2

関数が別のエラーをスローする可能性がある場合は、キャッチオールも追加する必要があります。

struct my_exception : public std::exception {
    my_exception(int); /* ... */ };

int main()
{
    try
    {
        int e;
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
        if ((e = function()) != SUCCESS) { throw my_exception(e); }
    }
    catch (my_exception & e)
    {
        std::cerr << "Something went wrong: " << e.what() << "\n";
    }
    catch (...)
    {
        //Error Checking
    }
}
于 2012-04-14T23:53:32.690 に答える
1

関数内でのチェックの処理についてはどうですか?

void my_function() {
  if (!create_window())
    throw Error("Failed to create window");
}

int main() {
  try {
    my_function();
  } catch (const Error& e) {
    cout << e.msg << endl;
  } catch (...) {
    cout << "Unknown exception caught\n"
  }

  return 0;
}
于 2012-04-15T01:20:41.293 に答える
0

それをより古風なものにしますが、元のエラー応答を維持しますが、エラーが発生するとすぐに応答し、見栄えが悪くなります:

#define callcheck(r) if ((r)==0) MAYDAY!_wehaveanerror()

callcheck(functiona(...));
callcheck(functiona(...));
...
于 2012-04-15T01:16:14.627 に答える
0

同じ関数を何度も呼び出す場合、マクロを使用するのが最も簡潔な方法かもしれません。私は次のようなものを提案します:

#define CHECKERROR(x) if(x == 0) wehaveanerror()

CHECKERROR(function(...));
CHECKERROR(function(...));

明らかに、このマクロは、関連する特定の関数とエラー ハンドラに非常に固有であるため、undefそれらの呼び出しの後に使用するのが賢明かもしれません。

于 2012-04-15T01:10:40.600 に答える