Perl Perl_0
Perl 「 ファイルハンドル 」: "die" (0x48)
die 関数
「 die 」関数を使えば、プログラマは Perl プログラムに対して、意図的に致命的なエラー (例外) を発生させることが出来ます。
例えば、「 もしファイルハンドルのオープンに失敗した場合 」には、プログラムを強制的に終了してメッセージを表示することが出来ます。
「 die 」関数の機能は、ファイルハンドルの操作に限定されるものではないので、「 もし * が出来なかった場合 」の例外処理として汎用的に利用出来ます。
書式
die 関数の書式は次の通りです。
die LIST
die 関数は、LIST で渡されたメッセージを STDERR ( 標準エラーストリーム ) に出力してから、「 0 」以外の終了ステータスでプログラムを終了します。
「 終了ステータス 」( Exit stats ) とは、プログラムがオペレーティングシステムに渡す、プログラム終了時の状態を表します。
通常終了ステータス「 0 」は、実行に成功したことを表すので、die 関数を使った例外的な終了時には「 0 」以外を返します。
die 関数を利用する
例えば、ファイルハンドルのオープンの成否を判断したい場合には、次の様に書くことで確認することが出来ます。
my $result = open FILE, '>', 'file';
if ( ! $result ) {
# open が失敗した場合の処理
:
.
}
1 行目では、open 演算子の真偽値をスカラ変数 $result に代入しています。「 真 」の場合は成功で、「 偽 」の場合は失敗です。
2 行目では、if 文を使って変数 $result を判定しています。条件式に「 ! 」が前置されているので、これは「 偽 」だった場合に真となります。
if 文のブロック内では、ファイルハンドルのオープンに失敗した場合の処理を書きます。
die 関数を使った場合は次の様になります。
if ( ! open FILE, '>', 'file' ) {
die "Cannot open File Handle for connection: $!";
}
if 文の条件式は前出の例にも適用出来ますが、ファイルハンドルのオープンが失敗した場合の処理がスマートに書かれています。
この場合、die 関数は、「 LIST 」に書かれたメッセージを出力してプログラムを終了します。
「 LIST 」の末尾にある「 $! 」は、Perl が持っている特殊な変数で、なぜ要求が失敗したのかを説明する、システムからのメッセージがセットされます。
例に出したプログラムの場合は、大抵「 permission denied 」や「 file not found 」といったメッセージがセットされます (Unix システムであれば)。
die 関数の「 LIST 」から「 $! 」を除外しても構いませんが、多くの場面では「 $! 」を含めておいたほうが親切です。
ただし、システムへの要求以外の場合では「 $! 」を除外した方が良いそうです。意味のあるメッセージが得られないからです。
「 システムへの要求以外 」がどいう場面なのかは今の僕には分かりませんが、無暗に使うものではないと認識しておきます。
プログラムファイル名と Chunk number
die 関数はまた、「 LIST 」のメッセージ、「 $! 」のメッセージに加えて、該当するプログラムのファイル名と、問題があると想定される部分の行番号 (Chunk number : 正確には行の番号ではないが、ほとんどの場合は行番号と同じ) を表示してくれます。
例えば次の様に。
My Message: file not found at programfile line 10.
プログラムをデバッグする場合に、行番号が表示されるのはとても助かることです。プログラマにとっては大変有用な機能と言えるでしょう。
しかしながら、反対に、プログラムを利用するだけのユーザにとっては不要なメッセージとも言えます。
そういう時は、次の様に改行を含めます。
die "Message: $!\n";
こうすれば、プログラムファイルの名前と Chunk Number は表示されなくなります。
ユーザにとってはシステムからのメッセージも不要な場合が多いでしょう。
そういう時は、「 $! 」も省いてしまいます。
die "Message\n";
ちなみに、次の様にするとファイル名と行番号だけを表示します。
die "Message";
使いどころは特にないと思いますが、die 関数の「 LIST 」内で、改行文字「 \n 」が果たす役割がよく分かるかと思います。
or die
前出の例では、if 文の条件式を利用して die 関数を使いましたが、インターネットにある多くの例では、次の様に「 or 」演算子を使うケースがほとんどです。
open FILE, '>', 'file' or die "Message: $!";
こちらの方が可読性が高くスマートです。
「 or 」と同じく OR を意味する演算子「 || 」も利用出来ます。
しかしながら、「 or 」と比較して「 || 」は優先順位が高いので、余分な括弧を追加する必要が出てくるかもしれません。例えば次の様に。
open (FILE, '>', 'file') || die "Message: $!";
または
(open FILE, '>', 'file') || die "Message: $!";
括弧が無い場合は、おそらく次の様に解釈されてしまいます。
open (FILE, '>', 'file' || die "Message: $!");
0x48 -> 0x49 へ
次回は、自動的な die を発動する「 autodie 」プラグマと、警告のための「 warn 」関数。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)