namazu-dev(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: use strerror()



Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx> wrote:

>エラーメッセージの出力には次の関数を用います。どの関数も
>printf() と同じ書式を受けつけます。
>
>  * nmz_warn_printf():  warning用 (単なる警告)
>  * nmz_debug_printf(): debug用 (開発者向け)

この 2つはいいとして、


>  * nmz_die():          すぐさま終了する (libnmz の中では使わない)

これは不要と判断して廃止しました。


>  * set_dyingmsg():     libnmz内で起きたエラーの内容を記録する

これは、

>    - エラーが起きた関数の名前も記録している (debug向け)

という約束が気持ち悪いので、(手動で関数名を引数に渡していた)

  #define nmz_set_dyingmsg(msg) \
    { \
        if (is_debugmode()) { \
            nmz_set_dyingmsg_sub("%s:%d: %s", __FILE__, __LINE__, msg);\
        } else { \
            nmz_set_dyingmsg_sub("%s", msg);\
	} \
    }

なるマクロを定義して

    nmz_set_dyingmsg(nmz_msg("%s", strerror(errno)));

のように使うことにしました。新しい方法の利点は次の 2つです。

  * 関数名を手動で引数に渡す手間が省ける
  * デバッグモードではファイル名と行番号を表示できる

たとえば、

  namazu: Out of memory

で終了するときに、デバッグオプション -d を指定して namazu を
実行すれば、 Out of memory がどこで起こったかを調べられます。

  namazu: search.c:329: Out of memory

そこまでする必要はあるかの? と疑問を感じなくもないですが、せっ
かく思いついたので導入しました。嫌になったら廃止すればいいで
すし。:-)

# "Out of memory" は strerror(errno)で取得するメッセージです

-- Satoru Takabayashi