師匠の散歩

Perlで遊ぼう

Error Indicatorの注釈

特殊変数ではエラーコードがたくさん並んでいる。一つ一つの英文を見るかぎり、もっともらしいことが書かれているが、そもそもこんなにたくさん必要なのだろうか。

ということで、調べ始めたが、結局、CPANの英文解説に戻ってきてしまった。 Error In dicator(CPAN)

eval q{
        open my $pipe, "/cdrom/install |" or die $!;
        my @res = <$pipe>;
        close $pipe or die "bad pipe: $?, $!";
    };

よく見かける記述方法である。eval関数の扱いはおいといて、エラーが発生したときに、$?$!にメッセージが入っているというやつだ。備考として次の記述がある。

$@ is set if the string to be eval-ed did not compile (this may happen if open or close were imported with bad prototypes), or if Perl code executed during evaluation die()d . In these cases the value of $@ is the compile error, or the argument to die (which will interpolate $! and $?). (See also Fatal, though.)
$@
evalでcompileできなかった文字列=エラー内容、がはいってくる
which will interpolate $! and $? = $@は $!と$?を補間するってことらしいが、なぜwillなんだろう。
$! is set to the C library's errno if one of these calls fails.
$!
ライブラリを呼び出すときに発生したエラーの内容
って英文どおりなんだが、Cライブラリっていうのがわからない。
CPANのC Library を見たけど(読んでいない)、難しそうだ。
一般的なエラーメッセージとしては、これが使われているようだ。
Under a few operating systems, $^E may contain a more verbose error indicator, such as in this case, "CDROM tray not closed." Systems that do not support extended error messages leave $^E the same as $!.
$^E
まれにシステムのエラーがあったときに、詳細エラーが入っている
CD-ROMなどのハードを扱うような場合のようで、たしかに「まれ」な状態だと思う。
Finally, $? may be set to non-0 value if the external program /cdrom/install fails. The upper eight bits reflect specific error conditions encountered by the program (the program's exit() value). The lower eight bits reflect mode of failure, like signal death and core dump information See wait(2) for details. In contrast to $! and $^E, which are set only if error condition is detected, the variable $? is set on each wait or pipe close, overwriting the old value. This is more like $@, which on every eval() is always set on failure and cleared on success.
$?
最後に、ときた。他のエラーメッセージはないといっている。
外部プログラムがエラーのとき non-0 がセットされる。
以降はよくわからない

die関数

die関数の使い方をメモする。

 open(IN, $datafile) or die($!);
die関数の「LIST」が改行で終わらない場合
プログラム名と行番号(及び場合によっては入力行)が標準出力(画面)に表示される
例えば「Error xxx.cgi line 15」
改行で終了する
行番号は表示されない
たとえば die("Error\n");
特殊変数「$!」はシステムに対する要求を行った時に発生したエラーを保存しています。この変数は数値として扱うとエラーコードを返しますが、文字列として扱うとエラーメッセージを取得できます。 die("Error $!"); ただしシステムに対する要求が失敗した時以外で「$!」を参照しても意味のあるメッセージは含まれていませんので注意して下さい。
eval{ hogehoge(); #何らかの関数 }; 
if($@){
  print $@;
}
eval{ };でトラップしたいところを囲んであげれば、呼び出した関数の中で死んでも、プログラム自体はinternal server errorで停止してしまうことは無くevalを抜けてきます。そして$@の中にエラーコード等が入ってくるので、これをチェックしてエラーチェックを行う事が出来ます。

戻る
2010-2011 grandmaster all rights reserved. 最終更新:2011/1/25