C でのエラー処理

Naila Saad Siddiqui 2023年10月12日
  1. C でのエラー処理
  2. グローバル変数 errno を使用
  3. perror() および strerror() 関数を使用する
  4. EXIT_STATUSを使用
  5. まとめ
C でのエラー処理

この短い記事では、C 言語プログラムでエラーを処理するために使用できるさまざまな方法について説明します。

C でのエラー処理

エラー処理 (または例外処理) は C で直接サポートされていませんが、言語でエラーを処理する方法はまだあります。 プログラマーは、関数の戻り値をテストし、エラーの発生を最初から防止する必要があります。

これらの戻り値の簡単なテストは、すぐに実行できます。 たとえば、if ステートメントは、多くの C 関数呼び出しがエラーの場合に -1 または NULL を返すためです。

C 言語では、さまざまな種類のエラーを処理するためにさまざまなメソッドを使用できます。 それらのいくつかは、この記事で説明されています。

  1. グローバル変数 errno を使用します。
  2. C 言語で perror() および strerror() 関数を使用する。
  3. 関数の終了ステータスを使用します。

グローバル変数 errno を使用

グローバル変数 errno は、ライブラリ ファイル errorno.h で定義されています。 C プログラミング言語では、errno という変数に、発生したエラーを特定するためのコード (値) が自動的に割り当てられます。

エラーの種類は、errno のさまざまなコード (値) によって示されます。 以下は、いくつかの異なる errno 値とその説明のリストです。

エラーコード 説明
1 この操作は許可されていません。
2 ファイルまたはディレクトリが見つかりません。
3 関数が見つかりません。
4 システムコールが中断されました。
5 入力または出力エラー。
6 そのようなデバイスは見つかりませんでした。
7 渡された引数リストが指定よりも長くなっています。
8 Exec 関数エラー。
9 不正なファイル番号エラー。
10 チリのプロセスが見つかりません。
11 もう一回やってみよう。
12 メモリ不足エラー。
13 アクセス許可が拒否されました。

存在しないファイルを開こうとするコード セグメントの例を考えてみましょう。 次に、errno 変数の値を確認します。

コード例:

#include <errno.h>
#include <stdio.h>
int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");
  printf("The errorno Value is: %d\n ", errno);

  return 0;
}

上記のコード例では、File のオブジェクトを作成し、fopen() 関数を呼び出して、読み取り用にファイルを開くことができるようにしました。 しかし、ディレクトリに見つからないファイル名を付けました。

そのため、エラーが発生し、errno 値が設定されます。 次に、その値を出力します。

出力:

errno デモ プログラムの出力

出力から、返されるエラー番号は 2 です。 上記の表から、2"そのようなファイルまたはディレクトリが見つかりませんでした" を意味することがわかります。

perror() および strerror() 関数を使用する

発生したエラーの種類は、上で取得した errno 値によって示されます。

エラーの説明が必要な場合は、2つの関数を使用して、エラー番号にリンクされたテキスト メッセージを表示できます。 これらは perror()strerror() です。

  • perror() 関数は、エラーに関するユーザー定義のテキスト メッセージを表示し、続いてその errno に設定された実際のメッセージを表示します。

    構文:

    void perror(const char *str)
    

    str は、実際のエラー メッセージの前に表示する必要があるカスタム メッセージの文字列です。

  • strerror は、渡された errno に設定されたテキスト メッセージを返します。

    構文:

    char *strerror(int errnum)
    

    errnum は、渡されるエラー番号です。

存在しないファイルを開く前の例を変更し、perror()strerror() を介してエラー メッセージを表示します。

コード例:

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

int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");

  if (file == NULL) {
    printf("Value of error number: %d\n", errno);
    perror("Error message by perror");
    printf("Error Message from strerror : %s\n", strerror(errno));
    `
  } else {
    fclose(file);
  }
  return 0;
}

上記のコード セグメントでは、errno 値を出力し、次に perror を使用してエラー メッセージを出力し、次に strerror を使用しています。

出力:

perror および strerror 出力

EXIT_STATUSを使用

終了の成功または失敗を示すために、C 標準では、exit() に渡すことができる EXIT SUCCESSEXIT FAILURE の 2つの定数マクロを指定しています。 これらのマクロは、stdlib.h にリストされているものです。

前の例をさらに変更し、ファイルが見つからず、ケース ファイルで成功した終了が見つかった場合は、失敗の終了呼び出しを行います。

コード例:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");

  if (file == NULL) {
    int errorNumber = errno;
    printf("Value of error number: %d\n", errno);
    perror("Error message by perror");
    printf("Error Message from strerror : %s\n", strerror(errno));
    exit(EXIT_FAILURE);
  } else {
    fclose(file);
    exit(EXIT_SUCCESS);
  }
  printf("Program exiting");
  return 0;
}

上記のコード例では、条件ステートメントの両方のケースに exit 関数を含めています。プログラムが終了する直前に printf 関数を追加しました。

プログラムは以前に終了するため、このメッセージは出力されません。

出力:

終了値出力

まとめ

C では、例外処理が明示的にサポートされていません。 ただし、特定のエラー処理プリミティブ (つまり、ライブラリ関数) を使用して、C で十分な例外処理を実現できます。

関連記事 - C Error