買い物かご 掲示板 メール DB 利用規定 FAQ サポートBBS


次(---)
前(ファイルの読みこみ)
必要なツール
最低限必要な知識
Make CGI Top
Basic

Home



エラー処理 --最低限必要な知識--


■エラー処理サブルーチン

今回は、いきなり処理のためのサブルーチンを紹介します。なお,今回はサンプルスクリプトは用意しておりません。

   sub error {
 
        print "Content-type: text/html\n\n"; 
        print "<html><head><title>エラー</title></head>\n";
        print "<body>\n";
        print <<"EOF";
        <h2 align=center>$_[0]</h2>
        <h3 align=center>$_[1]</h3>
        </body></html>
    EOF
    exit; 
 
    } 

上のエラー処理サブルーチンを呼び出すには・・・

&error ('エラー','data.datがないか、パーミッションが間違っています。');

を、エラーを表示したい個所に付け加えます。


■サブルーチン解説

Perl Editの「定型文」から入力できるエラー処理と違ったソースになっています。どちらも同じ処理をしているのですが、私のスクリプトでは、上のサブルーチンを使いまわしています。

ソース内の、

<h2 align=center>$_[0]</h2>
<h3 align=center>$_[1]</h3>

の赤字部分に注目してください。
<h2></h2> <h3></h3>は、単なる見だしタグです。

実際にエラーが発生すると、

エラー

data.datがないか、パーミッションが間違っています。

と表示されます。

では、どのようにしてエラーメッセージを表示させているのでしょうか?
最初に、エラーを出力させるソースを見ましょう。

&error ('エラー','data.datがないか、パーミッションが間違っています。');

赤字で記述されている「エラー」という文字列が<h2>タグで囲まれています。
青字で記述されている文字列が<h3>タグで囲まれています。

で、サブルーチン内で該当する個所を見ると・・・

<h2 align=center>$_[0]</h2>
<h3 align=center>$_[1]</h3>

となっていますね。

ここでは、一つ目のメッセージが $_[0]に、二つ目のが $_[1]に、それぞれ代入されています。以前、perlを始めとするプログラミング言語では、数字は0から数えると説明しています。

とすると・・・

エラー処理サブルーチンに渡された一つ目の値が$_[0]に、二つ目の値が$_[1]に代入されることになります。



サブルーチンに値を渡す

前に説明したサブルーチンは、制御をジャンプさせるだけの働きしか持っていませんでした。今回は、サブルーチンに特定の値を渡し、渡された値を元に、何らかの処理を行なうための方法も説明します。

サブルーチンに値を渡すための公式・・・

&サブルーチン名 ( ’一つ目の値’,’二つ目の値’・・・・,’n個目の値’);

このように、渡したい値(数字でも、日本語を含む文字列でも可) を一つずつ「'半角シングルクォーテーションまたは”半角ダブルクォーテーション」で囲み、それぞれの値を「,半角カンマ」で区切ります。

そして、受け取るほうのサブルーチンでは・・・

$_[0]に、一つ目の値が
$_[1]に、二つ目の値が


$_[n-1]に、n個目の値が、

それぞれ代入されます。

最後の値は、数字が0から始まるため、一つ少なくなります。10個の値を渡した場合は、$_[9]となります。

サブルーチンへ渡す値に変数が含まれる場合は、ダブルクォーテーションを使います。


組みこもう

最後に、エラー処理を組み込んで見ましょう。組みこむのは、regist.cgiです。

現状の「regist.cgi」では、エラー処理が組みこまれていないため、未記入でも動作してしまいます。そこで、メールアドレスを入力しない場合、「メールアドレスを入力してください」とエラーメッセージを出すように改造します。

エラー処理サブルーチンを組みこむ場所

基本的に、他のサブルーチンの中でなければ、どこに書きこんでも動作します。私は、習慣として、スクリプトの一番最後にいれることが多いです。

サブルーチン呼び出しソースコード

sub regist {

if ($FORM{'email'} eq '' ) { &error ('エラー','メールアドレスを入力してください。'); }

open (OUT,">>$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。');
print OUT "$FORM{'name'},$FORM{'email'},$FORM{'rem'}\n";
close (OUT);

以下略・・・

上のソースの意味は・・・

if ($FORM{'email'} eq '' )の’’(シングルクォーテーション二つ。ダブルクォーテーションが一つではありません。まちがえないように)は「空白であれば」を意味していますので、
「もし、email欄が空白であれば、エラー処理サブルーチンに『エラー』と『メールアドレスを入力してください』という文字列を渡しなさい。」

と命令しているのです。空白でなければ、命令は無視され、data.datを開こうとします。

エラー処理サブルーチンに渡す値を変更することで、どんな場面でも使いまわしが可能です。

次のエラー処理ルーチンは、

open (OUT,">>$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。');

「もし、data.datが開かなければ、エラー処理サブルーチンに、『オープンエラー』 『指定された書込みファイルが開けません。』という文字列を渡しなさい」

と命令しています。

エラー処理サブルーチンは、受け取った文字列を表示し、「exit;」命令があるので、スクリプトを終了します。

エラー処理をしていない時点では、data.datを準備していない場合、スクリプトはサーバーエラーを起こしました。これは、エラー処理サブルーチンがなかったため、処理を継続できなかったのが原因です。

今回エラー処理を付け加えたので、サーバーエラーを出すことなく、正常に処理を終了できます。


エラー処理は、通常以下の目的で使用されます。

設置者に対する処理 必要なファイルがない、設定を間違っているなどの原因でスクリプトが動作しない場合、どこが間違っているかを明確にするための用途。
ユーザーに対する処理 ユーザー(来訪者)の、書き込みや使用に制限をかける。
フォームなどの入力項目に不備があった場合、注意を促す。

その他、サーバーにトラブルが発生した場合の対処などにも利用されることがあります。

エラー処理は、スクリプトを作成する上で最も重要な作業です。自分で作って、自分で利用するような場合は、設置者に対する処理は不要と考えるかもしれません。しかし、サーバーエラーが出たときに、どこに不具合があるのかを探す手段としても使えますので、習慣として、エラー処理を組み込むようお勧めします。

ファイルを用意して、パーミッションもきちんと設定したはずなのに、「ファイルがない」とメッセージが出たとすれば、ファイル処理関連のソース内にバグがあると判断できますね。単なるサーバーエラーでは、どこが悪いのか見当もつきません。

エラー処理を付け加えることで、バグ出しやバグつぶしが比較的スピーディーに行なえるようになります。

特に、ファイルを開く、データを読み込む、メールを送信するなどの基本となる処理には、必ずエラー処理を付け加えるようにしましょう。


Web寺子屋 OGIPOGI E-mail:info@web-terakoya.net
Copyright© 2000-2001 OGIPOGI All Rights Reserved.