あらゆる場所でエラーをキャッチ

Deeplからの自動翻訳

エラー管理は、どの言語でも開発の制約になりがちです。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でテストすることができます。

Avatar
- プロダクトオーナー - Damien Fuzeauは、2019年2月に4D Productチームに参加しました。プロダクトオーナーとして、ユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換することを担当しています。また、実装された機能が顧客のニーズを満たしているかどうかを確認することも彼の役割です。ナント大学のソフトウェア工学科を卒業。前職の会社では最初は開発者として(1997年に4Dを発見)、後にエンジニアリングマネージャーとソフトウェアアーキテクトとして、23年以上勤務しました。この会社は、4DのOEMパートナーであり、現在は数千のユーザーと数百のサーバーに向けて4Dベースのビジネスソフトを展開しています。ですから、Damienは、多言語環境での4D開発・導入に慣れています。