0

いくつかのSDKの融合である特別なデバイスを制御するC++コードを書いています。私のコードは次のようになります

#define sdk1SafeCall(err) __sdk1SafeCall(err,__FILE__,__LINE__)

int errorcode = 0;
sdk1SafeCall(sdk1_InitializeDevice());
errorcode=sdk2_InitializeDevice();
errorcode=sdk3_InitializeDevice();

if (some_parameter)
{
    errorcode=sdk2_readDevice(true);
}
else
{
    errorcode=sdk3_writeDevice();
}
label again: errorcode=sdk1_readDevice();
if (error) goto again;

errorcode=close_everything();

パラメータを使用すると、制御フローが再配置されます。私の現在のメソッドは、cudaSafeCallのようなものを使用して、エラーコードをラップして終了します。方法がわからないのは、これらのエラーの詳細な説明をどこに保存するか、またはエラーから回復する方法(gotoの例など)です。結局のところ、コードは本当に乱雑に見えます。

編集

私は時々ラッパーでエラーを処理します。

4

1 に答える 1

1

エラーセーフなコードを書くのは難しいです。擬似コードでは、実際にはエラーをまったく処理しません。エラーコードは「close_everything()」の結果になります。これは、他のすべてがうまくいかなかった場合でも成功した可能性があります。

C ++でこの種の問題を解決する一般的な方法は、「リソース」(「デバイス」など)ごとにオブジェクトを用意し、問題が発生しthrowexception場合に回復することを期待しないことです。関数全体[または関数の外部セット]をtry/catchブロックにラップします。

もちろん、「障害は正常です」(たとえば、ネットワークポートから読み取ろうとして、使用可能なデータがなかったためにタイムアウトが発生した場合、例外をスローする必要はありません)。これは戻り値を使用する必要があります。

オブジェクトを使用してリソースを処理するには、コードを注意深く設計する必要があります。特に、デストラクタは、例外の後に実行されたコードを適切にクリーンアップする必要があります。コンストラクターで例外をスローする場合は、物を置き忘れないように注意してください。これにより、リークが発生します。

当然、他にもたくさんの解決策があります。結局のところ、私たちはプログラミングについて話しているので、何かを解決するための少なくとも11の異なる方法が常にあります。

于 2013-01-14T22:32:20.497 に答える