1. ホーム
  2. Web プログラミング
  3. ASP プログラミング
  4. アプリケーションのヒント

従来のいくつかの方法によるASPエラーの捕捉

2022-01-18 02:47:01

エラーの種類は大きく分けて3つあります。
コンパイルエラーです。
このエラーは、通常、コードの構文に問題があるために発生します。
コンパイルエラーによりASPの実行が停止しました。

実行エラー
ASPを実行しようとしたときに発生するエラーです。
例えば、ある変数に値を代入しようとしたが、その変数に許される範囲外であった場合。

ロジックエラー
論理エラーは最も検出が困難なものです。コンピュータが検出できない構造的なエラーであることが多いのです。
そのためには、自分たちのコードを徹底的に調べる必要があります。
コンパイルエラーはロジックエラーと一緒に発生し、大抵は表示されるので、心配なのは実行時のエラーだけです。すべてASPを終了させ、ユーザーに非常に不親切なテキストを大量に投下します。

では、ランタイムエラーにどう対処すればいいのか!?ASPが提供してくれる唯一のエラーコマンドであるOn Error Resume Next(初心者のための注意点ですが、ASPにはOn Error Resume Next文しかありません、On Error Resume Goto文はありません)On Error Resume Next文を使わなければ、すべてのランタイムエラーは致命的で、その後、ユーザーにエラーコードが「表示」されてASPプログラムは停止してしまいます。

以下は、エラーコードです。
/{br
 Microsoft OLE DB Provider for ODBC Drivers エラー 80004005
 [Microsoft][ODBC Driver Manager] データソース名が見つからず、デフォルトドライバが指定されない
 /test.asp, line 60 {
/
プログラムの先頭でOn Error Resume Nextステートメントを使用すると、すべてのエラーが無視され、自動的に次のステートメントが実行されます。こうすれば、プログラムは完全に実行され、ユーザーはエラーの後のエラーメッセージを見ることはありません。しかし、この方法では、プログラムが思ったように実行されない場合、何が悪かったのかを見つけるのが難しいという欠点があるので、必要なところでエラーに対処する必要があります。
エラー処理
ASPでエラーを処理する最善の方法は、プログラムの一番下にエラーを処理するコードを配置することです。また、すべてのASPプログラムでバッファを使用することをお勧めします。そうすれば、エラーが発生した場合、ページが停止し、ページの内容がクリアされるので、ユーザーはエラーメッセージを見ることはなく、あなたへの苦情も少なくなりますよ。以下はその例です。

<%@ LANGUAGE="VBScript" %>
 <% 'Set buffer to True
   Response.Buffer = True 
   'Start error handling
   On Error Resume Next
 %> 
 <% 'Error processing
   If Err.Number <> 0 Then
 'Clear the page
 Response.Clear
    'Show error message to user 
  %>
  <HTML>
 <HEAD>
 <TITLE></TITLE>
 </HEAD>
    <BODY BGCOLOR="#C0C0C0">
 <FONT FACE="ARIAL">An error occurred in the execution of this ASP page<BR>
 Please report the following information to the support desk<P>
     <B>Page Error Object</B><BR>
     Error Number: <%= Err.Number %><BR>
     Error Message: <%= Err.Description %><BR> 
     Error file: <%= Err.Source %><BR>
     Error Line: <%= Err.Line %><BR>
  </FONT>
 </BODY>
  </HTML>
 
 <%End If%>

上にあるように、まずOn Error Resume Nextを設定して、エラーが発生してもプログラムの実行に影響が出ないようにしています。
エラー処理とデータベース
エラー処理にデータベースの実行を加えると複雑です。例えば、データベースにレコードを追加するコマンドがたくさんあるプログラムがあったとして、insert/updateがプログラムの一番下で実行され、先にエラーが発生したら終わり!?データベースにエラーメッセージを追加していたはずです。On Error Resume Next を使っているので、全て無視されます! このプログラムは、前にエラーがあっても、データベースにデータを追加します。 {前のエラーが発生しても、プログラムはデータベースにデータを追加します。
これを避けるためには、まず何かをしなければならないのですが、その正しい対処法は次の通りです。 

 If Err.Number = 0 And objConnection.Errors.Count = 0 Then
 
 'The statement can only be executed here because there are no errors
 Set rstResults = dbData.Execute(txtSql) 
 End If

 より高度な処理
また、エラーが発生した場合、さらにエラーメッセージを表示することもできます。ここでは、データベースエラーとページエラーの両方を処理する例を示します。この例では、プログラム内のすべてのエラーを一度に見つけることができます。(問題発生時に英語の方が言いやすいと思うところがあるので、翻訳していません)。

<% 
 If Err.Number <> 0 Then
      Response.Clear
      Select Case Err.Number
  Case 8 'Specify the Number of the error
 'Handle custom errors here 
 
        Case Else 'General error
 
   If IsObject(objConnection) Then
       If objConnection.Errors.Count > 0 Then
 %>

              <B>Database Connection Object</B>
 
 <% For intLoop = 0 To objConnection.Errors.Count - 1 %>
 
             Error No: <%= objConnection.Errors(intLoop).Number %><BR>
             Description: <%= objConnection.Errors(intLoop).Description %><BR>
             Source: <%= objConnection.Errors(intLoop).Source %><BR>
             SQLState: <%= objConnection.Errors(intLoop).SQLState %><BR>
             NativeError: <%= objConnection.Errors(intLoop).NativeError %><P>
 
 <% Next
 End If
  
       End If
      If Err.Number <> 0 Then
 %>
 
           <B>Page Error Object</B><BR>
           Error Number <%= Err.Number %><BR>
           Error Description <%= Err.Description %><BR> 
        Source <%= Err.Source %><BR>
    LineNumber <%= Err.Line %><P>
 
 <% End If
    End Select
  End If
 %>

 上記の例では、私たちの日常のプログラミングでよく使われるデータベースで発生する問題の多くに対処することが可能です また、特定のエラーを処理することができるSelect Case文も見ておきましょう。 
リダイレクトとエラー処理
注意しなければならないのは、よく使うリダイレクトオブジェクトです。ページ内にリダイレクトオブジェクトがあると、エラー処理の意味がなくなってしまう。そこで、次のように、リダイレクトの前に処理する必要がある。 

 If Err.Number = 0 And objConnection.Errors.Count = 0 Then
  
 Response.Clear
 Response.Redirect ?lt;URL Here>?
 
 End If

コードをすっきりさせる
コードをすっきりさせるために、まず、エラー処理ファイルをインクルードファイルの中に入れてください。こうすることで、どのファイルでも使用することができます。また、この方法で簡単に修正することができます。
プログラムの先頭にOn Error Resume Next文を(もちろん言語宣言の後に)追加してください。
SQLを実行する前に、エラーがないか確認します。
リダイレクトを使用する前にも、エラー処理を行う。
エラー処理を行うインクルードファイルは、コードの先頭に置くようにしましょう