Saturday, September 1, 2018

C - エラー処理

したがって、Cプログラミングはエラー処理を直接サポートするのではなく、システムプログラミング言語であるため、戻り値の形式でより低いレベルでアクセスすることができます。 ほとんどのC関数やUnix関数呼び出しでも、エラーが発生した場合は-1またはNULLを返し、エラーコードerrnoを設定します。 これはグローバル変数として設定され、関数呼び出し中にエラーが発生したことを示します。 <error.h>ヘッダーファイルで定義されているさまざまなエラーコードを見つけることができます。

したがって、Cプログラマは戻り値をチェックし、戻り値に応じて適切な処置を取ることができます。 プログラムの初期化時にerrnoを0に設定するのがよい方法です。 0の値は、プログラムにエラーがないことを示します。


errno、perror()。 とstrerror()
Cプログラミング言語は、errnoに関連付けられたテキストメッセージを表示するために使用できるperror()関数とstrerror()関数を提供しています。

  1. perror()関数は、渡された文字列の後にコロン、スペース、そして現在のerrno値のテキスト表現を表示します。
  2. strerror()関数は、現在のerrno値のテキスト表現へのポインタを返します。

エラー状態をシミュレートし、存在しないファイルを開こうとしましょう。 ここでは両方の機能を使用して使用状況を表示していますが、エラーを1つ以上印刷する方法を使用できます。 2番目の重要な点は、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>

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);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます
Division by zero! Exiting...



プログラムの終了ステータス
正常な操作の後にプログラムが出てくる場合は、EXIT_SUCCESSの値で終了することが一般的です。 ここで、EXIT_SUCCESSはマクロで、0と定義されています。

あなたのプログラムにエラー状態があり、あなたが出てくるなら、-1と定義されたステータスEXIT_FAILUREで終了するべきです。 ですから、上記のプログラムを次のように記述しましょう

#include <stdio.h>
#include <stdlib.h>

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);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます

Value of quotient : 4


No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...