ON ERR CALL

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 3


ON ERR CALL (errorMethod)

引数説明
errorMethod文字列実行されるエラーメソッド, または
空の文字列でエラーのトラップ停止

説明

ON ERR CALL コマンドは、エラー検知用のメソッドとしてerrorMethodで渡した名前のプロジェクトメソッドをインストールします。このプロジェクトメソッドはエラー処理メソッドまたはエラーキャッチメソッドと呼ばれます。

このコマンドのスコープはカレントプロセスです。1つのプロセスには1度に1つのエラー処理メソッドだけを使用できますが、異なるプロセス間では、異なるエラー処理メソッドを持つことができます。

エラーの検知を中止するには、errorMethodに空の文字列を指定して再度ON ERR CALLコマンドをコールします。

エラー処理プロジェクトメソッドのインストール後は、エラーが発生するたびに4Dがこのメソッドを呼び出します。

エラーはシステム変数Errorの値で判別します。このシステム変数にはエラーコードが納められます。このマニュアルの付録にエラーコードが記載されています。詳細はシンタックスエラーおよびデータベースエンジンエラーを参照してください。システム変数Errorの値はエラー処理メソッド内のみで有効です。エラーの原因となったメソッド内でこのエラーコードが必要であれば、システム変数Errorを独自のプロセス変数にコピーしてください。

エラー処理メソッドは適切な方法でエラーを管理、またはユーザに対してエラーメッセージを表示します。エラーは次のようなものから生成されます:

・4Dデータベースエンジン: 例えば重複不可フィールドに既存の値を保存しようとした場合。

・4D環境: 例えば配列に割り当てるために十分なメモリがない場合。

・データベースが稼働しているOS: 例えばディスクに空きがなかったり、I/Oエラーの場合。

実行を中断するには、ABORTコマンドを使用できます。エラー処理メソッドでABORTコマンドを使用しない場合、4Dは割り込みをかけたメソッドに制御を戻し、メソッドの実行を続けます。エラーをリカバーできないときにABORT コマンドを使用します。

エラー処理メソッド自体でエラーが発生した場合は、4Dがエラー管理を引き継ぎます。したがって、エラー処理メソッドでエラーが発生しないように十分注意してください。また、エラー処理メソッドではON ERR CALLコマンドを使用することはできません。

ON ERR CALLは通常On startupデータベースメソッドから呼び出され、このアプリケーションのエラーを処理します。またON ERR CALLはメソッドの開始時に置かれて、そのメソッド特有のエラーを処理します。

ON ERR CALLでエラー処理メソッドをインストールすると、Windows上ではAltキー、Macintosh上ではoptionキーを押しながらマウスボタンをクリックして、メソッドのトレースを実行することができません。これは、Alt(option)キーを押しながらマウスボタンをクリックすると、エラーを生成し(エラーコード1006)、ON ERR CALLエラー処理メソッドが即座に起動されてしまうためです。ですが、このエラーコードはTRACEをコールして調べることができます。

例題

1. 次のプロジェクトメソッドは、引数で渡された名前のドキュメンを作成します。ドキュメントが作成できない場合、このプロジェクトメソッドは0またはエラーコードを返します:

      ` Create doc プロジェクトメソッド
      ` Create doc ( 文字列 ; ポインタ) -> 倍長整数
      ` Create doc ( DocName ; ->DocRef ) -> Error code result
   
   gError:=0
   ON ERR CALL("IO ERROR HANDLER")
   $2->:=Create document($1)
   ON ERR CALL("")
   $0:=gError

IO ERROR HANDLER プロジェクトメソッドは以下のようになります:

      ` IO ERROR HANDLER project method

gError:=Error ` エラーコードをプロセス変数にコピー

現在実行中のメソッド内でエラーコードの結果を取得するために、プロセス変数gErrorを使用している点に注意してください。データベースにこれらのメソッドを作成したら、次のようなコードを使用します:

      ` ...
   C_TIME(vhDocRef)
   $vlErrCode:=Create doc($vsDocumentName;->vhDocRef)
   If ($vlErrCode=0)
         `...
      CLOSE DOCUMENT($vlErrCode)
   Else
      ALERT ("ドキュメントを作成できませんでした, I/O error "+String($vlErrCode))
   End if
   

2. 配列とメモリの節の例題参照

3. 複雑な一連の処理を実装中に、各種サブルーチンで異なるエラー処理メソッドが必要となる場合があります。プロセスごとにいちどに1つのエラー処理メソッドしか持つことができないため、次の2通りの方法から対応策を選択することになります:

- ON ERR CALLコマンドを呼び出すたびに現在のエラー処理メソッドを保持する。または

- プロセス配列変数を使用し(この例ではasErrorMethod)、エラー処理メソッドとプロジェクトメソッド(この例ではON ERROR CALL)を“積み上げ”て、エラー処理メソッドのインストールとクリアを行う。

プロセスの実行を開始する時点で配列を初期化する必要があります:

      ` プロセスメソッドの最初に配列の初期化をするのを忘れないように。
   ARRAY STRING(63;asErrorMethod;0)

これはカスタマイズしたON ERROR CALLメソッドです:


      ` ON ERROR CALL project method
      ` ON ERROR CALL { ( 文字列 ) }
      ` ON ERROR CALL { ( Method Name ) }

   C_STRING(63;$1;$ErrorMethod)
   C_LONGINT($vlElem)

   If (Count parameters>0)
      $ErrorMethod:=$1
   Else 
      $ErrorMethod:=""
   End if 

   If ($ErrorMethod#"")
      C_LONGINT(gError)
      gError:=0
      $vlElem:=1+Size of array(asErrorMethod)
      INSERT IN array(asErrorMethod;$vlElem)
      asErrorMethod{$vlElem}:=$1
      ON ERR CALL($1)
   Else 
      ON ERR CALL("")
      $vlElem:=Size of array(asErrorMethod)
      If ($vlElem>0)
         DELETE FROM array(asErrorMethod;$vlElem)
         If ($vlElem>1)
            ON ERR CALL(asErrorMethod{$vlElem-1})
         End if 
      End if 
   End if 

次のように呼び出します:

   gError:=0
   ON ERROR CALL("IO ERRORS") ` IO ERRORS エラー処理メソッドをインストール
      ` ...
   ON ERROR CALL("ALL ERRORS") ` ALL ERRORS エラー処理メソッドをインストール
      ` ...
   ON ERROR CALL   ` ALL ERRORS エラー処理メソッドをアンインストールし、IO ERRORSを再インストール
      ` ...
   ON ERROR CALL   ` IO ERRORS エラー処理メソッドをアンインストール
      ` ...

4. 次のエラー処理メソッドはユーザによる割り込みを無視します:

      ` SHOW ONLY ERRORS project method
   If (Error#1006)
      ALERT ("The error "+String(Error)+" occurred.")
   End if 

参照

ABORT, Method called on error.


4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次