Try-Catchコードブロックの公開!

Deeplからの自動翻訳

throw()コマンドを実装し、Try(Expression)キーワードを導入した後、4Dのエラー処理システムの次の進化として、Try-Catchコードブロックを導入しました!

4D 20 R5 からは、新しいTryCatchEnd tryキーワードを活用することで、エラー処理能力を強化することができます。
これらの新しいキーワードの実用的なアプリケーションを説明するために、請求書行のある請求書を作成する例を見てみましょう。この例は、これらの新しいキーワードの直接的な利点を強調します:

Function createInvoice var var ( : . ; : ; : ) : . : . : . : . () := . () .:= . := ( ; ) := . . () . := . . := . .:= . () . () . () . () := . ({ { : "請求書作成失敗";¦ : ;¦ : . ;¦ xml-ph-0033@deep\ }) $customer cscustomerEntity $items Collection $invoiceRef Text csinvoiceEntity
var $newInvoice csinvoiceEntity
$newInvoiceLine csinvoiceLineEntity
$item Object

dsstartTransaction
Try
$newInvoiceThisnew
$newInvoicecustomer$customer
$newInvoiceinvoiceRef$invoiceRef
For each$item $items
$newInvoiceLinedsinvoiceLinenew
$newInvoiceLineitem$itemitem
$newInvoiceLineamount$itemamount
$newInvoiceLineinvoice invoiceRef $invoiceRef
items$newInvoice
$newInvoiceLinesave
End for each
$newInvoicesave
dsvalidateTransaction
Catch
dscancelTransaction
$newInvoiceNull
dslogErrors
message
errors Last errors
customer $customerID
$items

End try
return $newInvoice

この例の作成プロセスでは、開発者はエラーが発生した正確な場所には関心がない。単にエラーを記録し、無効なデータを作成していないことを確認したいだけです。
この関数は、顧客エンティティ、アイテム・コレクション、請求書参照をパラメータとして受け取ります。
トランザクションは、作成プロセス中のデータの整合性を保護するために、最初に開始されます。
すべての作成コードはTryコードブロックで保護されます。
請求書と請求書行がエラーなく作成されると、Tryコードブロックの最後でトランザクションが検証されます。
しかし、エラーが発生すると、Tryコードブロックのどこでエラーが発生しても、Catch コードブロックが実行されます。Catchコードブロックでは、トランザクションがキャンセルされ、カスタム関数によってエラーが記録されます。

Try-Catch コードブロックの詳細

コードブロックの実行を4Dエラーダイアログボックスの表示から保護するために、Tryと End tryキーワードでコードブロックを囲むことができます。
エラー処理は必須ではありません!そこで、End tryキーワードの前にCatchキーワードを挿入し、CatchキーワードとEnd tryキーワードの間の数行にエラー処理コードを書くことができるようになりました。このやり方は他の言語でも一般的で、長いメソッドや関数を読みやすくします!

Tryコードブロックの実行中にエラーが発生しなかった場合、コードはCatchコードブロック(もしあれば)をスキップし、Endtryキーワードの後に続けます。
しかし、Tryコードブロックのいずれかの行でエラーが発生した場合、その行は Catch コードブロックをスキップします:

  1. インストールされている場合、現在のエラーハンドラは呼び出されません。
  2. 4Dエラー・ダイアログ・ボックスは表示されません。
  3. エラーは現在のエラースタックに追加されます。
  4. コードの実行は直ちにCatchコードブロックに切り替わります。Catchキーワードがない場合、コードの実行は対応するEnd tryキーワードの直後にスキップされます。

現在の実行コンテキストにエラー・ハンドラが定義されておらず、Catchコード・ブロックの実行中にエラーが発生した場合、4D エラー・ダイアログ・ボックスが表示されることに注意してください。しかし、Try(Expression) または入れ子になったTry-Catchコードブロックを使用して、4D エラー・ダイアログ・ボックスの表示を回避することもできます!

エラースタックについて

Tryコードブロックの最初の行が実行される前に、現在のエラースタックはクリアされます。新しいエラーを検出するために、実行前と実行後のエラースタックを比較する必要がないため、この動作はほとんどの場合において有益です。
したがって、Try-CatchコードブロックをCatchコードブロックに挿入し、エラースタック全体を取得したい場合は、この例のように、あらかじめコレクションに格納しておくことを忘れないでください:

var $errors :Collection
Try
throw (123; "最初のエラー")
Catch
$errors .push(Last errors)
Try
throw (456; "2番目のエラー")
Catch
$errors .push(Last errors)
// $errors collection contains the two previous errors
End try
End try

グローバル・エラー処理との混合

コマンドを使ったエラー処理は ON ERR CALLコマンドを使ったエラー処理は、現在でも有効です。Try(Expression)やTry-Catchコードブロックと効果的に使うことができます。エラー処理の優先順位に注意してください:

  1. Try(Expression)。これは、1行でエラーをチェックできるため、最も正確な方法です。
  2. TryCatchコードブロック。行ごとのエラーチェックは不要と考える場合は、この方法が最適です。
  3. ON ERR CALLコマンドにデフォルト・オプションのek localを指定すると、現在のプロセス/ワーカーで今後実行されるコードで、管理されていないエラーを検出する。
  4. ON ERR CALLコマンドにek globalおよびek errors from componentsオプションを指定すると、エラー処理システムがインストールされていないか、コード化されていない場合にエラーを検出する。

Try(式)またはTry-Catchコードブロックを使用してエラー処理をコーディングする主な利点は、次のとおりです:

  • エラーを発生させるコードのできるだけ近くにエラー処理を配置する。
  • エラー処理コードでローカル変数を使用する

これで、エラーを思い通りに処理するための手札がすべて揃ったことになり、コードの安全性が高まります!

私たちは、ユーザーに最高の体験を提供するよう努力しています。4Dフォーラムであなたの意見やコメントを共有することをお勧めします。あなたのフィードバックは、私たちがあなたのニーズを理解し、私たちの製品とサービスを継続的に改善するのに役立ちます。
ハッピーコーディング!

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