| 4D v14.4ON ERR CALL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  | 
    4D v14.4
 ON ERR CALL 
         | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ON ERR CALL ( errorMethod ) | ||||||||
| 引数 | 型 | 説明 | ||||||
| errorMethod | 文字 |   | 実行されるエラーメソッド, または 空の文字列でエラーのトラップ停止 | |||||
ON ERR CALL コマンドは、エラー検知用のメソッドとしてerrorMethodで渡した名前のプロジェクトメソッドをインストールします。このプロジェクトメソッドはエラー処理メソッドまたはエラーキャッチメソッドと呼ばれます。
エラー処理プロジェクトメソッドのインストール後は、エラーが発生するたびに4Dがこのメソッドを呼び出します。
このコマンドのスコープはカレントプロセスです。1つのプロセスには1度に1つのエラー処理メソッドだけを使用できますが、異なるプロセス間では、異なるエラー処理メソッドを持つことができます。
注: コンポーネントを使用している場合、このコマンドはカレントデータベースに対してのみ適用されます。コンポーネントにおいてエラーが生成された場合、errorMethodはホストデータベースでは呼び出されません。
エラーの検知を中止するには、errorMethodに空の文字列を指定して再度ON ERR CALL コマンドをコールします。
エラーはシステム変数Errorの値で判別します。このシステム変数にはエラーコードが納められます。このマニュアルの付録に エラーコード が記載されています。詳細はシンタックスエラー (1 -> 81)を参照してください。システム変数Errorの値はエラー処理メソッド内のみで有効です。エラーの原因となったメソッド内でこのエラーコードが必要であれば、システム変数Errorを独自のプロセス変数にコピーしてください。またError methodとError lineシステム変数にはそれぞれエラーが発生したメソッドの名前とその行番号が設定されます (Error, Error method, Error line参照)。
GET LAST ERROR STACK コマンドを使用する事で割り込みの発生源のエラーシークエンス(例えばエラー"スタック"など)を取得する事ができます。
エラー処理メソッドは適切な方法でエラーを管理、またはユーザに対してエラーメッセージを表示します。エラーは以下で実行されたプロセス中に生成されます:
実行を中断するには、ABORT コマンドを使用できます。エラー処理メソッドでABORT コマンドを使用しない場合、4Dは割り込みをかけたメソッドに制御を戻し、メソッドの実行を続けます。エラーをリカバーできないときにABORT コマンドを使用します。
エラー処理メソッド自体でエラーが発生した場合は、4Dがエラー管理を引き継ぎます。したがって、エラー処理メソッドでエラーが発生しないように十分注意してください。また、エラー処理メソッドではON ERR CALL コマンドを使用することはできません。
ON ERR CALL は通常On startupデータベースメソッドから呼び出され、このアプリケーションのエラーを処理します。またON ERR CALL はメソッドの開始時に置かれて、そのメソッド特有のエラーを処理します。
次のプロジェクトメソッドは、引数で渡された名前のドキュメンを作成します。ドキュメントが作成できない場合、このプロジェクトメソッドは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:=gErrorIO 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配列とメモリの例題参照
複雑な一連の処理を実装中に、各種サブルーチンで異なるエラー処理メソッドが必要となる場合があります。プロセスごとにいちどに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 エラー処理メソッドをアンインストール
  ` ...次のエラー処理メソッドはユーザによる割り込みを無視します:
  ` SHOW ONLY ERRORS project method
 If(Error#1006)
    ALERT("The error "+String(Error)+" occurred.")
 End if
	プロダクト: 4D
	テーマ: 割込
	番号: 
        155
        
        
        
	
	初出: < 4D v6
	変更: 4D v12
	
	
	
	
	
	ランゲージリファレンス ( 4D v15)
	ランゲージリファレンス ( 4D v14.4)
	
	
	
 コメントを追加
コメントを追加