エラー処理
エラー処理とは、アプリケーション内で発生する可能性のあるエラーに備え、対処することです。 ランタイムにおけるエラーのキャッチや報告、またそれらの条件を検証するため、4Dは包括的なサポートを提供しています。
エラー処理は次の2つの要望に応えます:
- 開発フェーズにおいて、問題となりうるコードのエラーやバグを発見して修正したい。
- 運用フェーズにおいて、予期しないエラーを検知して回復したい。とくに、システムエラーダイアログ (ディスクが一杯、ファイルがない、など) を独自のインターフェースに置換できます。
サーバー上で実行されるコードのため、4D Server にはエラー処理メソッドを実装しておくことが強く推奨されます。 このメソッドによって、サーバーマシンにおいて予期せぬダイアログが表示されることを防ぎ、エラーの調査に必要なログを専用ファイルにとることができます。
エラー/ステータス
entity.save()
や transporter.send()
など、おおくの 4D クラス関数は status オブジェクトを返します。 ランタイムにおいて "想定される"、プログラムの実行を停止させないエラー (無効なパスワード、ロックされたエンティティなど) がこのオブジェクトに格納されます。 これらのエラーへの対応は、通常のコードによっておこなうことができます。
ディスク書き込みエラーやネットワークの問題などのイレギュラーな中断は "想定されない" エラーです。 これらのエラーは例外を発生させ、エラー処理メソッドを介して対応する必要があります。
エラー処理メソッドの実装
4D においては、エラー専用のプロジェクトメソッドである エラー処理 (または エラーキャッチ) メソッド内ですべてのエラーをキャッチし、処理することができます。
このプロジェクトメ ソッドはカレントプロセスに対して実装 (インストール) され、インタープリターモードかコンパイルモードかにかかわらず、プロセス内で発生するすべてのエラーの際に自動で呼び出されます。 このプロジェクトメソッドを 実装 するには、ON ERR CALL
コマンドをコールし、コマンドに当該プロジェクトメソッド名を引数として渡します。 例:
ON ERR CALL("IO_ERRORS") // エラー処理メソッドを実装します
エラーの検知を中止するには、空の文字列を指定して再度 ON ERR CALL
コマンドをコールします:
ON ERR CALL("") // エラーの検知を中止します
Method called on error
コマンドは、ON ERR CALL
によってカレントプロセスにインストールされているエラー処理メソッド名を返します。 このコマンドは汎用的なコードでとくに有用です。エラー処理メソッドを一時的に変更し、後で復元することができます:
$methCurrent:=Method called on error
ON ERR CALL("NewMethod")
// ドキュメントを開くことができなければエラーが生成されます
$ref:=Open document("MyDocument")
// 前のエラー処理メソッドに戻します
ON ERR CALL($methCurrent)
スコープとコンポーネント
アプリケーションにおいて一つのエラーキャッチメソッドを使うやり方もあれば、アプリケーションのモジュールごとに違うメソッドを定義する方法もあります。 ただし、一つのプロセスにつき実装できるのは一つのメソッドのみです。
ON ERR CALL
コマンドによって実装されたエラー処理メソッドは実行中のアプリケーションにしか適用されません。 つまり、コンポーネント によってエラーが生成されても、ホストアプリケーションにおいて ON ERR CALL
で実装 されたエラー処理メソッドは反応しませんし、逆もまた然りです。
メソッド内でのエラー処理
独自に作成してエラー処理メソッド内では、エラーを調査するための情報がいくつか提供されています:
-
専用のシステム変数:
Error
(倍長整数): エラーコードError method
(テキスト): エラーを生成したメソッドの名称Error line
(倍長整数): エラーを生成したメソッドの行番号Error formula
(テキスト): エラーの元となった 4D コードのフォーミュラ (テキスト)
4D は、いくつかの システム変数 と呼ばれる専用の変数を自動的に管理しています。 :::
GET LAST ERROR STACK
コマンドは、4Dアプリケーションの現在のエラースタックに関する情報を返します。Get call chain
コマンドは、カレントプロセス内における、メソッド呼び出しチェーンの各ステップを詳細に説 明するオブジェクトのコレクションを返します。
例題
簡単なエラー処理システムの例です:
// エラー処理メソッドをインストールします
ON ERR CALL("errorMethod")
//... コードの実行
ON ERR CALL("") // エラーの検知を中止します
// errorMethod プロジェクトメソッド
If(Error#1006) // これはユーザーによる割り込みではありません
ALERT("エラー "+String(Error)+" が発生しました。 問題となったコードはこちらです: \""+Error formula+"\"")
End if
空のエラー処理メソッド
標準のエラーダイアログを表示させないようにするには、空のエラー処理メソッドを実装するだけで実現できます。 Error
システム変数はエラー処理メソッド以外のメソッドでも確認することが できます:
ON ERR CALL("emptyMethod") // emptyMethod は空のエラー処理メソッドです
$doc:=Open document( "myFile.txt")
If (Error=-43)
ALERT("ファイルが見つかりません。")
End if
ON ERR CALL("")