[解決済み] Cコードにおけるエラー処理
質問
C言語ライブラリで一貫した方法でエラーを処理する場合、どのようなことがベストプラクティスになりますか?
私が考えていたのは2つの方法です。
常にエラーコードを返す。典型的な関数は以下のようなものです。
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
常にエラーポインタを提供するアプローチ。
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
最初の方法を用いると、このようにエラー処理のチェックを関数呼び出し時に直接行うようなコードを書くことができます。
int size;
if(getObjectSize(h, &size) != MYAPI_SUCCESS) {
// Error handling
}
このエラー処理コードよりよさそうだ。
MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
// Error handling
}
しかし、データを返す際に戻り値を使用することで、より読みやすいコードになると思います。
これらのアプローチのどれを選ぶべきか、あるいはそれらを混ぜたり、他のものを使ったりするべきか、何かアイデアはありますか?グローバルなエラー状態は、ライブラリのマルチスレッド使用をより困難にする傾向があるため、私は好きではありません。
EDIT C++に特化したアイデアも、例外を伴わないものであれば、今のところ選択肢に入らないので、聞いてみると面白いと思います...。
解決方法は?
私はエラーを戻り値とする方法が好きです。もしあなたがAPIを設計していて、ライブラリの利用をできるだけ苦痛のないものにしたいのであれば、これらの追加について考えてみてください。
-
すべての可能なエラー状態を1つの型定義されたenumに格納し、それをlibで使用する。単に int を返したり、さらに悪いことに int や異なる列挙型を戻り値に混ぜるのはやめましょう。
-
エラーを人間が読めるような形に変換する機能を用意する。単純なものでよい。error-enum in, const char* out だけである。
-
このアイデアはマルチスレッドでの使用を少し難しくしていますが、アプリケーションプログラマがグローバルなエラーコールバックを設定できればいいと思います。そうすれば、バグハントセッション中にコールバックにブレークポイントを置くことができるようになります。
お役に立てれば幸いです。
関連
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] pthread_cond_wait で spurious wakeup が発生するのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み】"static const" vs "#define" vs "enum"
-
[解決済み】assert関数とは何ですか?