C:
エラー処理

方法:

Cは他の言語のように例外のための組み込みサポートを持っていません。代わりに、関数から特別な値を返す、errnoのようなグローバル変数を設定するなど、いくつかの従来のエラー処理戦略に頼っています。

特別な値を返す

関数は、有効な結果としてありそうにない特定の値を返すことでエラーを示すことができます。以下は整数の例です:

#include <stdio.h>

int inverse(int number, double *result) {
    if (number == 0) {
        return -1; // エラーケース
    } else {
        *result = 1.0 / number;
        return 0; // 成功
    }
}

int main() {
    double result;
    if (inverse(0, &result) < 0) {
        printf("Error: Division by zero.\n");
    } else {
        printf("The inverse is: %f\n", result);
    }
    
    return 0;
}

出力:

Error: Division by zero.

errnoをチェックする

システムやOS(ファイルI/Oなど)とやり取りする特にライブラリ関数では、エラーが発生するとerrnoが設定されます。これを使用するには、errno.hをインクルードして、予想される失敗の後でerrnoをチェックします:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
    }
    
    return 0;
}

出力:

Error opening file: No such file or directory

ディープダイブ

歴史的に、Cプログラミング言語のミニマリスティックなデザインは、その低レベルでシステムプログラミングの起源を反映し、最大の性能とメタルに近い制御が重要な場合に、組み込みの例外処理メカニズムを除外してきました。代わりに、Cはプログラマーに可能な限り多くの制御を提供するというその哲学に適合する、より手動のエラー処理アプローチを採用しています。これは便利さのコストであってもです。

このアプローチはCの設計目標とよく一致しているものの、冗長なエラーチェックコードや見逃されたエラーチェックの可能性を生じさせ、近代的な言語が構造化された例外処理メカニズムで対処しているものです。例えば、JavaやC#のような言語での例外は、エラー処理を中央化し、コードをクリーナーにし、エラー管理をより直接的にすることができます。しかし、例外はそれ自体のオーバーヘッドや複雑さを導入し、Cが輝くシステムレベルのプログラミングには理想的ではないかもしれません。

その粗野さにもかかわらず、Cにおけるこの手動のエラー処理は、エラー条件の明確さがより予測可能でデバッグしやすいコードにつながるモデルを多くの他の言語のエラー管理の設計に情報を提供しています。致命的なシステムで、障害を優雅に管理する必要がある場合、Cのエラー処理パラダイムは、エラー処理ライブラリや規約などの現代のベストプラクティスと組み合わせることで、堅牢性と信頼性を保証します。