ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
ON ERR CALL
|
ON ERR CALL ( errorMethod {; scope} ) | ||||||||
引数 | 型 | 説明 | ||||||
errorMethod | 文字 |
![]() |
実行されるエラーメソッド, または 空の文字列でエラーのトラップ停止 | |||||
scope | 整数 |
![]() |
エラーメソッドのスコープ | |||||
ON ERR CALL コマンドは、カレントプロジェクト内の指定された実行コンテキストにおけるエラー検知用のメソッドとして errorMethod で渡した名前のプロジェクトメソッドをインストールします。このプロジェクトメソッドはエラー処理メソッドまたはエラーキャッチメソッドと呼ばれます。
エラー処理メソッドはプロジェクトごとにインストールされます。コンポーネントとホストのプロジェクトはそれぞれ独自のエラー処理メソッドを定義することができ、エラーが発生したプロジェクトのメソッドのみが呼び出されます。
エラー処理プロジェクトメソッドのインストール後は、定義された実行コンテキスト内において4D ランゲージコマンドの実行中にエラーが発生するたびに4D がこのメソッドを呼び出します。
コマンドのscope 引数は、エラーがerrorMethod 引数で指定したメソッドの呼び出しをトリガーする実行コンテキストを指定します。デフォルトでは、引数が省略されていた場合にはコマンドのスコープはローカルの実行コンテキスト、つまりカレントプロセスです。scope 引数には、以下の定数のいづれか1つを渡すことができます:
定数 | 値 | コメント |
ek errors from components | 2 | コンポーネントで発生したエラー |
ek global | 1 | プロジェクトのグローバル実行コンテキストで発生したエラー |
ek local | 0 | ローカル実行コンテキストで発生したエラー(scope 引数が省略されていた場合のデフォルト) |
注意: コンパイルモードで、プリエンプティブ・プロセスから ON ERR CALL をコールしている場合、コンパイラーは errorMethod がスレッドセーフかどうかを確認し、プリエンプティブ・モードに適応していないと判断すればエラーを返します。詳細については プリエンプティブ4Dプロセス を参照ください。
エラーの検知を中止するには、scope 引数で指定したいスコープ(あれば)を指定し、errorMethod に空の文字列を指定して再度ON ERR CALL コマンドを呼びだします。
エラーはシステム変数Error の値で判別します。このシステム変数にはエラーコードが納められます。このマニュアルの付録に エラーコード が記載されています。詳細はシンタックスエラー (1 -> 81)を参照してください。システム変数Error の値はエラー処理メソッド内のみで有効です。エラーの原因となったメソッド内でこのエラーコードが必要であれば、システム変数Error を独自のプロセス変数にコピーしてください。またError method 、Error lineとError formula システム変数にはそれぞれ、エラーが発生したメソッドの名前とその行番号、フォーミュラのテキストが格納されます (メソッド内でのエラー処理 参照)。
Last errors または GET LAST ERROR STACK コマンドを使用する事で割り込みの発生源のエラーシークエンス(例えばエラー"スタック"など)を取得する事ができます。
エラー処理メソッドは適切な方法でエラーを管理、またはユーザに対してエラーメッセージを表示します。エラーは以下で実行されたプロセス中に生成されます:
実行を中断するには、ABORT コマンドを使用できます。エラー処理メソッドでABORT コマンドを使用しない場合、4Dは割り込みをかけたメソッドに制御を戻し、メソッドの実行を続けます。エラーをリカバーできないときにABORT コマンドを使用します。
エラー処理メソッド自体でエラーが発生した場合は、4Dがエラー管理を引き継ぎます。したがって、エラー処理メソッドでエラーが発生しないように十分注意してください。また、エラー処理メソッドではON ERR CALL コマンドを使用することはできません。
ON ERR CALL は通常On startupデータベースメソッドから呼び出され、このアプリケーションのエラーを処理します。またON ERR CALL はメソッドの開始時に置かれて、そのメソッド特有のエラーを処理します。
グローバルなエラー処理メソッドを、例えばOn Startup データベースメソッドで定義したい場合を考えます:
ON ERR CALL("myGlobalErrorHandler";ek global)
次のプロジェクトメソッドは、引数で渡された名前のドキュメンを作成します。ドキュメントが作成できない場合、このプロジェクトメソッドは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
this is a test
ABORT
Error Handler
GET LAST ERROR STACK
Last errors
Method called on error
システム変数
プロダクト: 4D
テーマ: 割込
番号:
155
初出: < 4D v6
変更: 4D v12
変更: 4D v15 R5
変更: 4D v19 R8
ランゲージリファレンス ( 4D v20 R7)