|
||||
|
|
8章 エラー処理
|
|
|
エラーの種類
VBScriptだけと言う訳ではなく、プログラムの作成にはエラーというものがついて回ります。 ただ、一言でエラーといってもエラーというのは多くの種類が存在します。スペルミスによるエラー、表記方法が間違っているエラー、時にはメモリ不足によってもエラーが発生する場合があります。 このように多くのエラーがありますが、これらは大きく分けて [ 構文エラー ] と [ 実行時エラー ] に大別することが出来ます。これらがどのようなものかは順に読み進んでみてください。
構文エラー
構文エラーとは表記方法が VBScriptの言語規則に違反している時に発生するエラーです。このエラーはプログラム実行前のコンパイル時に発生します。例えば次のような場合に構文エラーとなります。
1 . <%@ LANGUAGE = VBSCRIPT %> 2 . <% 3 . Option Explicit 4 . 5 . Dim intCnt 6 . 7 . Response.Write("これから1から10までを表示します。<br><br>") 8 . 9 . For intCnt = 1 To 10 10. Response.Write(intCnt & "<br>" 11. Next 12. 13. Response.Write("<br>終了です。") 14. 15. %> 上記の ASPは数字の1〜10までを表示する単純なものですが、実行したところ下のようなエラーが発生します。 ![]() ブラウザに表示されるこのエラーメッセージでは、発生しているエラーの内容(サンプルでは ')'がありません )と、そのエラーがソースファイルの何行目(サンプルでは10行目)で発生しているのかを教えてくれています。 では10行目の末尾に ")" を付けてみましょう。以下のように正常に動作し、結果がブラウザに表示されたと思います。 ![]() 実行時エラー
実行時エラーとは、構文的には問題ないのですが、VBScriptが処理できない動作を実行しようとしたときに発生するエラーです。例えば次のような場合に実行エラーとなります。
1 . <%@ LANGUAGE = VBSCRIPT %> 2 . <% 3 . Option Explicit 4 . 5 . Dim intCnt 6 . 7 . Response.Write("これから10を10から1までで除算して結果を表示します。<br><br>") 8 . 9 . For intCnt = 10 To 0 Step -1 10. Response.Write(intCnt & " で除算した結果は " & 10 / intCnt & " です。<br>") 11. Next 12. 13. Response.Write("<br>終了です。") 14. 15. %> 上記の ASPは 10を 10から 1までの数値で除算し、その結果を表示しようという意図で作成したものです。 しかしこの ASPを実行すると下図のように途中までは想定した正しい値が表示されていますが、いきなり [ 実行時エラー ] とエラーメッセ-が表示されてしまい、最後に表示されるはずの [ 終了 です。] というメッセージが表示されていません。 ![]() この原因は、本来 10を 10〜 1 で除算を行うことを想定していたのも関わらず、赤字の箇所の記述ミスにより予定外の 0まで処理されてしまい、ループの最後に [ 10 / 0 ] が実行されているためです。 0での除算は処理できないので、この除算を実行したときにエラーが発生してしまい、そのメッセージを出力して処理が以上終了してしまっているのです。このようなエラーは文法的には正しいので、コンパイル段階ではエラーとなりません。各変数に値が割り当てられ、実行されて初めて分かるエラーです。 エラー処理
実際のプログラムでは、上で紹介したサンプルのようにエラーで異常終了してしまうプログラムなどは作らないようにします。これまで、どのようなエラーがあって、どんな場合に発生するものなのかを紹介してきましたが、次からは実行エラーに対する対処方法を見てみましょう。構文エラーについては、エラーがなくなるまでソースファイルを修正するしかありません。
On Error Resume Next
On Error Resume Next はそれ以降のエラーを無効に設定します。 On Error Resume Next を記述しておくことによって、エラーが発生したステートメントをスキップし、次のステートメントへ処理を移すことが出来ます。 エラーをスキップしてその次のステートメントを実行することで、エラーに対する処理を記述する事が可能になります。 ※ VisualBasic、VBAでは On Error GO TO "ラベル名" と記述すればエラーラベルへジャンプすることが可能でしたが、VBScriptでは残念ながら使用することが出来ません。
1 . <%@ LANGUAGE = VBSCRIPT %> 2 . <% 3 . Option Explicit 4 . 5 . On Error Resume Next 6 . 7 . Dim intCnt 8 . 9 . Response.Write("これから10を10から11までで除算して結果を表示します。<br><br>") 10 . 11 . For intCnt = 10 To 0 Step -1 12. Response.Write(intCnt & " で除算した結果は " & 10 / intCnt & " です。<br>") 13. Next 14. 15. If Err.Number <> 0 Then 16. Response.Write("エラー:" & Err.Description) 17. End If 18. 19. Response.Write("<br>終了です。") 20. 21. %> 上記のオレンジ箇所が今回追加したコードになります。先ずコード上部に [ On Error Resume Next ] を記述し、エラーを無効にします。 Errオブジェクトの説明は後述しますが、Numberプロパティを参照し、0でなければエラーが発生したと判断してエラー概要を出力します。下記出力結果で [ エラー:0 で除算しました。] と表示されている箇所が、このエラー処理にて出力された結果になります。前回の解説ではここで処理が終了していましたが、今回は最後まで処理が行われているのが分かると思います。 ![]() On Error Go To 0
On Error Go To 0 は無効に設定したエラーを有効にします。 On Error Resume Next を記述するとエラーが無効になることは前途しましたが、On Error Go To 0 は逆にそれ以降で無効となったエラーを有効に戻します。 Errオブジェクト
Number プロパティ
[エラー番号] = Err.Number (= 設定値 )
このプロパティを参照することで、発生したエラーの番号を取得することができます。 Description プロパティ
[エラー概要] = Description (= 設定値 )
このプロパティを参照することで最後に発生したエラーの概要を取得することができます。 Source プロパティ
[発生オブジェクト・アプリケーション] = Source (= 設定値 )
エラーを発生させたオブジェクトのクラス名またはプログラム ID を指定します。 Clear メソッド
Err.Clear
Errオブジェクトの設定値をクリアします。また、"On Error Resume Next"、"Exit Sub"、"Exit" ステートメントを実行しても Clear メソッドが自動的に呼び出されます。 Raise メソッド
Err.Raise (エラー番号, [発生オブジェクト], [エラーメッセージ], [ヘルプファイル], [ヘルプ内コンテキスト番号])
Raiseメソッドは実行時エラーを発生させることができます。 ASPError オブジェクト
ASP では次は、前途した Err オブジェクトと、エラー情報を保持するオブジェクトとして、もう一つ ASPErrorオブジェクトという組み込みオブジェクトが用意されています。ASP でエラーが発生すると、IIS はエラーを生成し、Server.Transfer メソッドを実行して定義されているエラー ページに制御を渡します。 (デフォルトでは /iishelp/common/500-100.asp です) このカスタムページを変更し、ASPError オブジェクトを使用することでプログラマが任意のエラーページを作成することが出来ます。
※ ASPError オブジェクトは、ASP 3.0 から導入されたため、Windows 2000 以前の OS では利用できません。
カスタムエラーページを設定する
まずカスタムエラー用の ASPファイルを作成します。 次のファイルを "C:\Inetpub\Scripts\ErrSample.asp" として保存して下さい。このページがエラー発生時に表示されるページになります。カスタムエラーとしての設定については、次から順に読み進めていって下さい。 [ ErrSample.asp ]
<%@Language="VBSCRIPT"%> <% Option Explicit On Error Resume Next Response.Clear Dim objAspErr Set objAspErr = Server.GetLastError() %> <html> <body> <h3>エラーが発生しました</h3> <table border=0 cellspacing=0 cellpadding=0> <tr> <td> <table border=0 cellspacing=1 cellpadding=5> <tr> <td bgcolor="#F4F4FC">エラーコード</td> <td bgcolor="#EEEEEE"><%=objAspErr.ASPCode %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー番号</td> <td bgcolor="#EEEEEE"><%=objAspErr.Number %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー概要</td> <td bgcolor="#EEEEEE"><%=objAspErr.Description %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー詳細</td> <td bgcolor="#EEEEEE"><%=objAspErr.ASPDescription %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラーソース</td> <td bgcolor="#EEEEEE"><%=objAspErr.Source %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー種別</td> <td bgcolor="#EEEEEE"><%=objAspErr.Category %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー発生ファイル</td> <td bgcolor="#EEEEEE"><%=objAspErr.File %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー発生行</td> <td bgcolor="#EEEEEE"><%=objAspErr.Line %></td> </tr> <tr> <td bgcolor="#F4F4FC">エラー発生列</td> <td bgcolor="#EEEEEE"><%=objAspErr.Column %></td> </tr> </table> </td> </tr> </table> </body> </html> 1. [ IIS管理画面 -> 既定のWebサイト -> Scripts -> プロパティ -> カスタムエラー ] で以下の画面を表示します。HTTPエラー 500;100 に既定では "/iisHelp/common/500-100.asp" が設定されているのが分かると思います。このリストにカーソルを合わせて "プロパティの編集" を押下します。 ![]() 2. プロパティの編集から URL 入力欄に先ほど作成したパスを指定します。 ![]() 3. 先ほどの規定値から入力した値に変更されたと思います。これでカスタムエラーの設定は終了です。 ![]() 4. 先ほどの規定値から入力した値に変更されたと思います。これでカスタムエラーの設定は終了です。 次にエラーを発生させるスクリプトです。 下記のスクリプトを "C:\InetPub\Scripts\Sample.asp" として保存してみて下さい。 [ sample.asp ]
<%@ LANGUAGE = VBSCRIPT %> <html> <body> <%Response.Write(1/0)%> </body> </html> 上記で作成した sample.asp ファイルを http 経由でアクセスすると以下のようなエラーが表示されます。 このエラー画面は先ほどカスタムエラーメッセージとして作成した ASP ファイルから出力されているメッセージです。ASPError オブジェクトに次のようなプロパティがセットされているのが分かると思います。 ![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||