4Dコードのエラー管理を強化

v20R2 から、4Dコードで エラーをスロー できるようになりました。

これらのエラーは、他の 4Dエラーと同じように動作します: エラーダイアログをトリガーするか、ON ERR CALL メソッドで処理できます。

この機能により、発生した例外を積極的に検出することで、コードの品質を向上させることができます。また、エラーログも改善することができます。

重要なのは、この機能が強固なエラー管理を実現するための第一歩であることです。

では、詳細を掘り下げていきましょう!

この機能は、新しい throw コマンドに依存しています。このコマンドの使い方を、以下の説明および HDI で紹介します。

HDI: エラーのスロー

エラーの投げ方と処理方法

throw コマンドでスローされるエラーは、他の 4Dエラーと同じように動作します。最初の例では、ON ERR CALL メソッドは設定されていません。

エラーはコードおよび説明とともにスローされ、エラーダイアログをトリガーします。

throw(1; "これはエラーです")

次の例では、ON ERR CALL メソッドが設定されており、スローされたエラーは Last errors コマンドで取得できます:

ON ERR CALL("handleErrors")
throw (1; "これはエラーです")

 

blank

 

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 &quot;{name}&quot; is not found in {path}.</source>
<target>{path} において、&quot;{name}&quot; のファイルは見つかりませんでした。</target>
</trans-unit>

ON ERR CALLメソッドは、このエラーを処理することができます:

blank

 

遅延モードを使用する

オブジェクト引数において、ブール型のプロパティ 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 &quot;{name}&quot; is not found in {path}.</source>
<target>{path} において、&quot;{name}&quot; のファイルは見つかりませんでした。</target>
</trans-unit>
<trans-unit id="2" resname="ERR_HDI1_2">
<source>Try another file name</source>
<target>別のファイル名をお試しください。</target>
</trans-unit>

handleError メソッドは一度だけ呼び出され、Last errors コマンドを使ってエラースタックを取得することができます:

blank

遅延モードを使用するには、throw コマンドを引数なしで呼び出す方法もあります。これは ON ERR CALL メソッド内で有用です。

これにより、メソッドが実行終了するまで、カレントエラーがスタックされます。その後、ON ERR CALL メソッドが呼び出され、エラースタックを処理します。

これは HDI で具体例を紹介しています。

HDI をダウンロードして、ユーザーに適切なフィードバックを提供するためのエラー処理の方法について確認してみてください。

 

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。