工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C言語エラーハンドリングのマスター:ベストプラクティスとテクニック

C言語自体はエラーハンドリングの直接的なサポートを提供しませんが、システムプログラミング言語として、戻り値という形で低レベルなアクセスを提供します。ほとんどのCやUnixの関数呼び出しは、エラー時に-1やNULLを返し、エラーコードをerrnoに設定します。これはグローバル変数として、関数呼び出し時にエラーが発生したことを示します。様々なエラーコードは<error.h>ヘッダーファイルで定義されています。

Cプログラマは戻り値をチェックし、戻り値に応じた適切な対応を取れます。プログラム初期化時にerrnoを0に設定しておくのは良い習慣です。0はプログラムにエラーがないことを意味します。

errno、perror()、strerror()

C言語はperror()とstrerror()関数を提供し、errnoに関連付けられたテキストメッセージを表示できます。

存在しないファイルを開こうとしてエラーをシミュレートし、両関数の使い方を示します(どちらか一方でも構いません)。重要な点として、エラー出力にはstderrファイルストリームを使うべきです。

#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;

int main() {
    FILE *pf;
    int errnum;
    pf = fopen("unexist.txt", "rb");
    if (pf == NULL) {
        errnum = errno;
        fprintf(stderr, "Value of errno: %d\n", errno);
        perror("Error printed by perror");
        fprintf(stderr, "Error opening file: %s\n", strerror(errnum));
    } else {
        fclose(pf);
    }
    return 0;
}

実行結果:

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

ゼロ除算エラー

除算時に除数がゼロかどうかをチェックせず、実行時エラーになるのはよくある問題です。

以下のコードは、除算前に除数がゼロかチェックして対処しています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int dividend = 20;
    int divisor = 0;
    int quotient;
    if (divisor == 0) {
        fprintf(stderr, "Division by zero! Exiting...\n");
        exit(-1);
    }
    quotient = dividend / divisor;
    fprintf(stderr, "Value of quotient : %d\n", quotient);
    exit(0);
    return 0;
}

実行結果:

Division by zero! Exiting...

プログラム終了ステータス

正常終了時はEXIT_SUCCESS(マクロで0と定義)で終了するのが一般的です。エラー発生時はEXIT_FAILURE(-1と定義)で終了すべきです。上記プログラムを書き直すと:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int dividend = 20;
    int divisor = 5;
    int quotient;
    if (divisor == 0) {
        fprintf(stderr, "Division by zero! Exiting...\n");
        exit(EXIT_FAILURE);
    }
    quotient = dividend / divisor;
    fprintf(stderr, "Value of quotient : %d\n", quotient);
    exit(EXIT_SUCCESS);
    return 0;
}

実行結果:

Value of quotient : 4

C言語

  1. 動力伝達ベルトの保管・取り扱いベストプラクティス
  2. マテリアルハンドリングの理解:主要概念とベストプラクティス
  3. マテリアルハンドリング機器の4大カテゴリー:保管・システム・トラック・散装
  4. マテリアルハンドリング安全の極意:効率的でリスクフリーな作業のためのベストプラクティス
  5. ADCコードエラー率(CER)を理解する:知っておくべきポイント
  6. C言語 ファイル入出力: fopen, fprintf, fread, fseek をマスターする
  7. C#ファイル操作実践ガイド:存在確認、読み書き、コピー、削除
  8. C++シグナル処理をマスター:安全な割り込み管理とクリーンなプログラム終了
  9. C#の例外処理:try/catch/finally/throwとベストプラクティス
  10. Python例外処理をマスター:包括的ガイド
  11. Java例外ハンドリング完全攻略:try-catch、finally、throw、throws