4D v16.3

ON ERR CALL

ホーム

 
4D v16.3
ON ERR CALL

ON ERR CALL 


 

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

説明   

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

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

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

注:

  • コンポーネントを使用している場合、このコマンドはカレントデータベースに対してのみ適用されます。コンポーネントにおいてエラーが生成された場合、errorMethodはホストデータベースでは呼び出されません。
  • 64-bit のコンパイルモードで、プリエンプティブ・プロセスから ON ERR CALL をコールしている場合、コンパイラーは errorMethod がスレッドセーフかどうかを確認し、プリエンプティブ・モードに適応していないと判断すればエラーを返します。詳細については プリエンプティブ4Dプロセス を参照ください。

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

エラーはシステム変数Errorの値で判別します。このシステム変数にはエラーコードが納められます。このマニュアルの付録に エラーコード が記載されています。詳細はシンタックスエラー (1 -> 81)を参照してください。システム変数Errorの値はエラー処理メソッド内のみで有効です。エラーの原因となったメソッド内でこのエラーコードが必要であれば、システム変数Errorを独自のプロセス変数にコピーしてください。またError methodError lineError formulaシステム変数にはそれぞれ、エラーが発生したメソッドの名前とその行番号、フォーミュラのテキストが格納されます (Error, Error method, Error line参照)。

GET LAST ERROR STACK コマンドを使用する事で割り込みの発生源のエラーシークエンス(例えばエラー"スタック"など)を取得する事ができます。

エラー処理メソッドは適切な方法でエラーを管理、またはユーザに対してエラーメッセージを表示します。エラーは以下で実行されたプロセス中に生成されます:

  • 4Dデータベースエンジン: 例えばレコードの保存がトリガールールに違反する場合。
  • 4D環境: 例えば配列に割り当てるために十分なメモリがない場合。
  • データベースが稼働しているOS: 例えばディスクに空きがなかったり、I/Oエラーの場合。

実行を中断するには、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:=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

配列とメモリの例題参照

複雑な一連の処理を実装中に、各種サブルーチンで異なるエラー処理メソッドが必要となる場合があります。プロセスごとにいちどに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_errors_only プロジェクトメソッド
 If(Error#1006) //これはユーザーによる割り込みではない
    ALERT("エラー "+String(Error)+" が発生しました。問題となったコードはこちらです: \""+Error formula+"\"")
 End if



参照 

ABORT
GET LAST ERROR STACK
Method called on error
システム変数

 
プロパティ 

プロダクト: 4D
テーマ: 割込
番号: 155

This command can be run in preemptive processes

 
履歴 

初出: < 4D v6
変更: 4D v12
変更: 4D v15 R5

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v16)
ランゲージリファレンス ( 4D v16.1)
ランゲージリファレンス ( 4D v16.2)
ランゲージリファレンス ( 4D v16.3)