サイトマップ / C言語講座出入り口総目次目次:バグ対策>エラーメッセージ

青い直線

エラーメッセージ

青い直線

[NDEBUGマクロとassert( )]←このソース→[悪質なバグの例]

/* エラーを示すグローバル変数 */

/* errno はエラーを示すグローバル変数です。プログラム起動時に、0に初期化されます。標準ライブラリ関数のあるものは、エラーを検出すると、エラーの種類に応じて、error.h に定義されているエラー番号をerrno にセットします。

エラーを検出するには、既に呼ばれた他の関数によって、エラー番号がセットされている可能性があるので、関数を呼び出す直前に errno を0に再初期化して置き、関数を呼び出した直後に errno の値を調べます。

今回は、平方根を返すライブラリ関数を例にして、エラーの検出について学びます。平方根を返すライブラリ関数を下記に示します。

    #include <math.h>
    double  sqrt(double x);

    例:y = sqrt(x);

sqrt( ) は、double 型の浮動小数点数 x の平方根を返します。もし、x が負ならば0を返し、同時に errno に EDOM をセットします。EDOM とは、ドメインエラーのことで、関数に渡した値が不正(ここでは、負の値)の時セットされます。

strerror( )

下記に示すライブラリ関数 strerror( ) は、セットされたエラー番号に対応するエラーメッセージ文字列へのポインタを返します。

    #include <string.h>
    char *strerror(int n);

    例:emsg = strerror(n);

strerror( ) は、下記のように使います。

    char *emsg = "Invalid Argument for sqrt(  )";
    fprintf(stderr, "%s: %s\n", emsg, strerror(errno));

標準ライブラリ関数には、直接、エラーメッセージを標準エラー出力に出力する関数 perror( ) も用意されています。下記に示します。

    #include <stdio.h>
    void perror(const char *s);

    例:perror(s);

例に示した使い方は次のコードと同等です。

    fprintf(stderr, "%s: %s\n", s, strerror(errno));

perror( ) は、文字列 s とともに errno に対応するエラーメッセージを、標準エラー出力 ( stderr ) に出力します。

標準エラー出力はプログラム起動時に、標準入力 ( キーボード ) 、標準出力 ( コンソール ) 、とともに開かれるストリーム ( 読み込み書き込みをする対象、即ち、ファイル ) です。標準エラー出力も標準出力もともにコンソールに出力しますが、標準エラー出力はバッファリングをしません。プログラムに何か異常が起きた時は、より確実に表示される標準エラー出力にメッセージを書き込みます。

今回は、-1.0 を引数に sqrt( ) を呼び出して、わざとエラーを起こし、perror( ) でエラーの内容を表示します。 */

/* ここからソースプログラム */

#include  <stdio.h>
#include  <math.h>    /* sqrt(  ) に必要 */
#include  <errno.h>   /* errno を使うために必要 */

void main(void);

void main(void)
{	
    errno = 0;    /* グローバル変数 errno を0に初期化 */

      /* -1の平方根を求めようとした */
    printf("sqrt( -1.0 ) : %lf\n", sqrt(-1.0));

    if (errno)    /* errno が0でなければ */
    perror("Invalid Argument for sqrt(  )");
}

/* ここまでソースプログラム */

/* 他のエラーについては errno.h を見て下さい。 */

[NDEBUGマクロとassert( )]←このソース→[悪質なバグの例]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:バグ対策>エラーメッセージ