namazu-dev(ring)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
use strerror()
- From: Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx>
- Date: Fri, 07 Jan 2000 20:06:05 +0900
GNUコーディングスタンダードの日本語訳
<http://duff.kuicr.kyoto-u.ac.jp/~okuji/gnujdoc.html> を読み
ました。
で、次の文を読んでさっそく strerror(errno) を使うように徹底
しました。:-)
| エラーを無視したいと思っているのでなければ、あらゆるシステム
| コールのエラーを確認しなさい。失敗したシステムコールから発生
| するあらゆる エラーメッセージに、もしあればファイルの名前と
| そのユーティリティの名前 だけでなく、(perrorや同等のものから
| 得られる)システムエラー文字 列を含めなさい。単なる"cannot
| open foo.c"や"stat failed"は十分でな い。
fopen や malloc の直後では必ず strerror(errno) でエラーメッ
セージを取得します。
エラーメッセージの出力には次の関数を用います。どの関数も
printf() と同じ書式を受けつけます。
* nmz_warn_printf(): warning用 (単なる警告)
* nmz_debug_printf(): debug用 (開発者向け)
* nmz_die(): すぐさま終了する (libnmz の中では使わない)
* set_dyingmsg(): libnmz内で起きたエラーの内容を記録する
- エラーが起きた関数の名前も記録している (debug向け)
...
ところで、 assert() の変種として次のマクロを作りました。
rcfile.c の中で使っています。いかがなものでしょう?
#define MUST_NOT_BE_REACHED_HERE() \
{\
fprintf(stderr, "%s: %s:%d: MUST NOT BE REACHED HERE! Report bug!\n",\
PACKAGE, __FILE__, __LINE__);\
abort();\
}
こんな感じに使います。
if (foo) {
do something;
} else if (bar) {
do something;
} else if (baz) {
do something;
} else {
MUST_NOT_BE_REACHED_HERE(); // ここには絶対に来ないはず
}
万が一、 MUST_NOT_BE_REACHED_HERE() にたどり着くと、
foobar: foobar.c:342: MUST NOT BE REACHED HERE! Report bug!
zsh: 30148 abort (core dumped) foobar
となります。
# こういうことをしているプログラムはどのくらいあるのだろう?
-- Satoru Takabayashi