2012-04-14 2 views
5

C++/Cでプログラミングしているときに、同じ関数を何度も呼び出してしまうことがあります。これらすべての呼び出しでエラーをチェックする最も効率的な方法は何ですか? if 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(); 
} 

注:私はそれが最初のエラーで例外をスローすることによって、この問題を解決するだろうとtrycatchを使用してC++のために良いかもしれないことを理解し、それに伴う問題は、それが多くと互換性がないということですWindows APIなどのエラーコードを返す関数ありがとう!

+1

母は、私の質問を更新しました:) – user99545

+2

は、なぜあなたはできるだけ早くエラーが発生したときに知っている、とあなたはそれを得るよう、各リターンコードをチェックしたいとは思わないでしょうか?あなたの方法を使用すると、一連のエラーを生成し、最初のものについてのみ調べることができます。 –

+0

渡すパラメータのリストを繰り返し、その繰り返しのパラメータで関数を呼び出し、エラーが最初に検出されたときに「われわれはエラーがあります」boolをtrueに設定し、その場でループを終了します。 – DavidO

答えて

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 
    } 
} 
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"; 
    } 
} 
+0

または、エラーコードを例外に変換する薄いレイヤーでWindows API関数をラップできます。 Borland Delphiはこれを15年前に行っていました。 –

0

同じ機能を繰り返し呼び出す場合は、マクロを使用するのが最も簡単な方法です。

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

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

それはこれらの呼び出し後undefそれに賢明かもしれので、明らかに、このマクロは、関係する特定の機能やエラーハンドラに非常に具体的な次のようになります。私のようなものをお勧めします。

0

それより古い学校をやってますが、元のエラー応答/ wを保ったが、すぐにエラーが醜い探してO/W起こるとして応答:

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

callcheck(functiona(...)); 
callcheck(functiona(...)); 
... 
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; 
}