v20R2 から、4Dコードで エラーをスロー できるようになりました。
これらのエラーは、他の 4Dエラーと同じように動作します: エラーダイアログをトリガーするか、ON ERR CALL メソッドで処理できます。
この機能により、発生した例外を積極的に検出することで、コードの品質を向上させることができます。また、エラーログも改善することができます。
重要なのは、この機能が強固なエラー管理を実現するための第一歩であることです。
では、詳細を掘り下げていきましょう!
この機能は、新しい throw コマンドに依存しています。このコマンドの使い方を、以下の説明および HDI で紹介します。
エラーの投げ方と処理方法
throw コマンドでスローされるエラーは、他の 4Dエラーと同じように動作します。最初の例では、ON ERR CALL メソッドは設定されていません。
エラーはコードおよび説明とともにスローされ、エラーダイアログをトリガーします。
throw(1; "これはエラーです")
次の例では、ON ERR CALL メソッドが設定されており、スローされたエラーは Last errors コマンドで取得できます:
ON ERR CALL("handleErrors")
throw (1; "これはエラーです")
throwコマンドの詳細
この新しいコマンドは、必要に応じてさまざまな方法で呼び出すことができます。
定義済みのエラーをスローする
プロジェクトの XLFファイルに設定した定義済みのエラーを発生させることができます。そのためには、throw コマンドの引数としてオブジェクトを渡します。このオブジェクトには、以下のプロパティが含まれていなければなりません:
- componentSignature: エラーを発生させたコンポーネントコード
- errCode: エラーコード
プロジェクトの XLF ファイル内で、resname が ERR_componentSignature_errCode と一致するエラーメッセージが検索され、エラーがスローされます。
エラーメッセージには、動的なプレースホルダー値を使用できます。XLFファイルで、プレースホルダー名を中括弧 {} で囲んで指定します。次に、エラーオブジェクトに、プレースホルダー名を名前とするプロパティを追加し、その値を指定します。
例
var $file : 4D.File
ON ERR CALL("handleError")
$file:=File("/PROJECT/HDI file")
If (Not($file.exists))
throw({componentSignature: "HDI1"; errCode: 1; name: "HDI file"; path: "/Project"})
End if
以下は、日本語に翻訳された Errors.xlf ファイルのサンプルです:
<trans-unit id="1" resname="ERR_HDI1_1">
<source>The file "{name}" is not found in {path}.</source>
<target>{path} において、"{name}" のファイルは見つかりませんでした。</target>
</trans-unit>
ON ERR CALLメソッドは、このエラーを処理することができます:
遅延モードを使用する
オブジェクト引数において、ブール型のプロパティ deferred を使用すると、スローされたエラーをスタックし、後でグローバルに処理することができます。以下のメソッドでは、ON ERR CALL メソッドがメソッド実行の最後に呼び出され、Last errors コマンドによって返されるエラースタックを処理します:
var $file : 4D.File
ON ERR CALL("handleError")
$file:=File("/PROJECT/HDI file")
If (Not($file.exists))
throw({componentSignature: "HDI1"; errCode: 1; name: "HDI file"; path: "/Project"; deferred: True})
throw({componentSignature: "HDI1"; errCode: 2; name: "HDI file"; path: "/Project"; deferred: True})
End if
以下は日本語に翻訳された Errors.xlf ファイルのサンプルです:
<trans-unit id="1" resname="ERR_HDI1_1">
<source>The file "{name}" is not found in {path}.</source>
<target>{path} において、"{name}" のファイルは見つかりませんでした。</target>
</trans-unit>
<trans-unit id="2" resname="ERR_HDI1_2">
<source>Try another file name</source>
<target>別のファイル名をお試しください。</target>
</trans-unit>
handleError メソッドは一度だけ呼び出され、Last errors コマンドを使ってエラースタックを取得することができます:
遅延モードを使用するには、throw コマンドを引数なしで呼び出す方法もあります。これは ON ERR CALL メソッド内で有用です。
これにより、メソッドが実行終了するまで、カレントエラーがスタックされます。その後、ON ERR CALL メソッドが呼び出され、エラースタックを処理します。
これは HDI で具体例を紹介しています。
HDI をダウンロードして、ユーザーに適切なフィードバックを提供するためのエラー処理の方法について確認してみてください。