エラー処理
エラー処理とは、アプリケーション内で発生する可能性のあるエラーに備え、対処することです。 ランタイムにおけるエラーのキャッチや報告、またそれらの条件を検証するため、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("")