エラー管理は、どの言語でも開発の制約になりがちです。4Dでは、新しいプロセス/ワーカーでエラー処理メソッドを呼び忘れたり、エラーを処理しないコンポーネントを使用したりすると、4D組み込みのエラーダイアログが最終ユーザーに表示されることがあります。4D開発者は、この組み込みの4Dエラーダイアログを表示させないために、すべてのコンテキストですべてのエラーをキャッチしたいと思います。
4D v19 R8で、この動作をどのように管理するか見てみましょう。
グローバルエラーハンドラ
これまで、実行コンテキストでエラーを処理するためのベストプラクティスは、コマンドを使用して、メソッドハンドラを ON ERR CALLコマンドを使用し、パラメータとしてメソッドハンドラを渡すことでした。しかし、このエラーメソッドは、現在のプロセスコンテキストでのみ呼び出されました。
4D v19 R8からは、すべての実行コンテキストに対して効率的なグローバルエラーハンドラを定義することもできるようになりました。もし、新しいプロセス/ワーカーでローカルエラーハンドラを定義するのを忘れた場合、グローバルエラーハンドラは自動的に呼び出されます。そこで、アプリケーションを保存するために、例えばOn Startupデータベースメソッドにグローバルエラーハンドラを定義することができます。
ON ERR CALL("myGlobalErrorHandler"; ek global)
現在のプロセスで呼び出されるエラーメソッドを渡すのは、やはり効率的です。私たちはこれをローカル・エラー・ハンドラと名付けました。
ON ERR CALL("myLocalErrorHandler")
// equivalent to:
ON ERR CALL("myLocalErrorHandler"; ek local)
なお、ローカルエラーハンドラは、グローバルエラーハンドラが定義されていても、定義されていれば呼び出されるので、定義したローカルエラーハンドラは通常通り実行されます。 グローバルエラーハンドラは、現在の実行コンテキストでローカルエラーハンドラが定義されていない場合にのみ呼び出されます。
4D サーバー上の ORDA 関数と計算された属性
ご存知のように、ORDA関数や計算属性がクライアントアプリケーションで使用される場合、それは4Dサーバー側で実行されます。そのため、これらの関数や計算属性がローカルエラーハンドラを定義せず、エラーを投げると、ヘッドレスで実行されない場合、4D Server上でビルトイン4Dエラーダイアログが表示されます。
それを避けるために、例によってOn Server Startupデータベースメソッドでサーバー側のグローバルエラーハンドラを定義することができるようになりました。
ON ERR CALL("myServerGlobalErrorHandler"; ek global)
コンポーネント
コンポーネント開発者として、エラーを処理するのが簡単になりました。On Host Database Eventデータベースメソッド(例えば、On before host database startupイベント)でグローバルなエラーハンドラを定義するだけで、エラーが発生してもホストデータベースに内蔵された 4D エラーダイアログが表示されないようにすることができます!こうすることで、コンポーネントによって生成されたすべてのエ ラーが、ホストデータベースへの副作用なしに、コンポーネントのグ ローバルエラーハンドラを呼び出すことができます。
コンポーネントのユーザーとして、コンポーネントの実行コンテキストでキャッチされていないコンポーネントのエラーを処理することによって、アプリケーションをより安全にすることができます。これを行うことで、自身のエラーを正しく管理しないコンポーネントを使用する場合、それらを管理することができ、4D組み込みのエラーダイアログが表示されなくなります。コンポーネントエラーハンドラメソッドをインストールするには、このように対応するパラメータを使用するだけです。
ON ERR CALL("myComponentErrorHandler"; ek errors from components)
これは、グローバルなエラーハンドラでもありますが、コンポーネントによってキャッチされないエラーに特化しているので、これらのための特別なものを開発することができます。エラーシステム変数(error,error method,error line, error formula) は、このコンポーネントエラーハンドラでは利用できないことに注意してください。しかし、エラースタックはまだ利用可能です。
共通動作
エラースタック
また、エラースタック全体を取得するための新しいコマンドも導入しました。 Last errors.このコマンドは、各項目がスタック全体のエラーであるコレクションを返し、各エラーにはエラー番号、メッセージ、内部コンポーネントのシグネチャに関する情報が含まれています。
現在のエラーハンドラの取得
コマンドにオプションのパラメータが追加されました。 Method called on the errorコマンドは、このサンプルのように、グローバルエラーハンドラと コンポーネントエラーハンドラを取得するためのオプションのパラメータを許容するようになりました。
$localHandler:=Method called on error
$globalHandler:=Method called on error(ek global)
$componentHandler:=Method called on error(ek errors from component)
エラーの中断
どのハンドラが実行されたとしても ABORTコマンドは常に実用的であり、通常通りコードを中断することができます。
これらの新しい動作はすべて上記のHDIでテストすることができます。