1

ちょっとしたベストプラクティスのアドバイスを探しています。

ユーザーが何らかの価格表を保存できるサービス「価格表サービス」があります。

一貫性のないデータを残す可能性のあるインスタンスまたは構成がいくつかあります。これらのイベントでは、関数の実行を終了したいと考えています。

たとえば、customerId がオブジェクトに設定されていない場合や、営業担当者の userId がデータベースで見つからなかった場合などです。


私の質問は、ビジネス ロジック エラーが発生したときに関数を終了する最善の方法は何ですか?

例外がその場で実行を停止し、例外を再スローできるようにする方法が気に入っています。それに関する問題は、例外はフロー制御に使用されるべきではないと聞いたことがあります。

現在、ネストされた if/else がたくさんあるので、ローカル変数$service_error_messageが設定されていない限り、トランザクションをコミットしません。

が null の場合$service_error_message、バリデーターはどれも失敗していないことがわかり、保存しても問題ありません。

これらのシナリオをより適切に処理する方法について提案がある人はいますか?

4

2 に答える 2

2

間違いなく致命的で、そこから回復する方法がないエラーに遭遇した場合は、クリーンアップして終了してください。現在の手順の範囲外でクリーンアップを行う必要がない場合 (ファイル/DB 接続などを閉じたり、エラー出力を生成したりするなど) は、単純exitに最も理にかなっています。エラーが回復可能な可能性がある場合、または現在の手順の外部にある何らかの方法で整然とした方法でエラーをクリーンアップ/ログに記録したい場合は、例外が最も理にかなっています。ケースバイケースの判断です。

I've have heard exceptions aren't to be used for flow control-これは本当ですが、あなたが説明している状況には実際には当てはまりません。実際のエラーが発生した場合、例外は完全に受け入れられます。すべきでないことは、例外を使用して、次に実行されるコードを決定することですgoto

してはいけないこととその理由についての適切な説明は、ここにあります。

于 2012-08-13T15:49:48.117 に答える
1

通常、フロー制御に例外を使用することはありません。スクリプトから抜け出したい場所で何らかの条件が定期的に発生することを期待しているかのように、exit()呼び出しを使用します。

私の意見では、例外は、コード内で発生してはならない何か (オブジェクトのメソッドまたは関数に渡された無効なパラメーターなど)、つまり真に例外的な何かに遭遇した場合にのみスローされます。また、例外を適切にキャッチして処理できる呼び出しコードの周りに try-catch ブロックがある場合にのみ、それらを使用します。

たとえば、try-catch ブロック内でデータベース接続をインスタンス化し、接続を確立できなかった場合に DB 抽象化レイヤーに例外をスローさせる場合があります。その後、例外をキャッチしてログに記録します。データベース接続がサービスの機能にとって絶対に不可欠である場合exit()は、アプリケーションから適切に削除してください。

私にとって、DB クエリから空の結果セットを取得する (つまり、ユーザー ログインをチェックする) ことは、例外をスローして処理しないものではなく、適切なエンド ユーザー メッセージを提供し、必要に応じてスクリプトを適切に終了することです。 .

于 2012-08-13T15:50:28.943 に答える