1. ホーム
  2. c

[解決済み] Cコードにおけるエラー処理

2022-04-23 23:52:55

質問

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 だけである。

  • このアイデアはマルチスレッドでの使用を少し難しくしていますが、アプリケーションプログラマがグローバルなエラーコールバックを設定できればいいと思います。そうすれば、バグハントセッション中にコールバックにブレークポイントを置くことができるようになります。

お役に立てれば幸いです。