質問

サーバーとのtcpソケット通信をカプセル化するクラスがあります。サーバーに送信される各コマンドメッセージについて、サーバーは必ず応答コード(OK、Fail)を含む応答メッセージを送り返します。クラスを使用して、各コマンドを同期または非同期のいずれかで実行できます。

発生する可能性のある例外には、基本的に2つのタイプがあります。これは、切断またはその他の回復不能なエラーと、「送信バッファがいっぱいです」などの予期しない例外が原因です。障害が発生した場合、接続が再確立されるまで、コマンドを続行または再試行することはできません。失敗した応答または例外の場合でも、コマンドを再試行できます...

したがって、現在、私のsyncコマンドメソッドは、OK、Fail、Faultの値を持つ列挙型を返します。例外が発生した場合、(同期コマンドで)呼び出しスレッドに単純に発生します。非同期コマンドの場合、Resultプロパティの列挙値に追加値OK、Fail、Fault、またはExceptionを含めることができ、コールバックはコマンドオブジェクトのExceptionプロパティを介して実際の例外オブジェクトにアクセスできます。

この戦略についてどう思いますか?私は同期コマンドで例外をまったく発生させず、例外を内部的に記録し、代わりに4番目の列挙値を返すように誘惑されています。結果コードをすべて表示し、すべてのケースで例外を発生させますか?

ありがとう。

役に立ちましたか?

解決

あなたの戦略は基本的に健全だと思います。

例外の目的は例外的な条件に対処することであることに留意してください。問題の原因に近いほど良い。

あなたの場合、あなたの戦略は"今のところうまくいかなかったようなもののようです。再試行してみましょう」。本当に例外を発生させる理由がわかりません。

閉じたソケットを扱うことがコードでまったく異なるフローを必要とするものである場合、例外が意味をなすかもしれません。あなたの説明から、それは実際にはそうではありません。

例外に関する私の哲学は、あなたが本当に対処できない例外的な条件のためでなければならないということです。閉じたソケット?うーん...何回私の家でインターネットがダウンしますか...

他のヒント

私の好みは、メソッドがミッションを正常に完了しなかった場合に例外をスローすることです。したがって、呼び出し元の私がyourObject.UploadFile()を呼び出すと、呼び出しが戻ったときにファイルが正常にアップロードされたと見なされます。何らかの理由で失敗した場合、オブジェクトが例外をスローすることを期待しています。再試行できるコマンドと再試行しないコマンドを区別する場合は、その情報を例外に入れて、それに応じて対処する方法を決定できます。

yourObject.BeginAsyncUploadFile()を呼び出すとき、IAsyncResultまたは同等のオブジェクトを待機してファイルのアップロードが成功したかどうかを確認し、例外/エラーを確認する必要があることを除いて、同じ動作を期待しますそうでない場合はプロパティ。

結果コードと例外はどちらも正常に機能します。それは個人的な好みの問題です(そしてあなたのチームの他の人の好みです)。例外には、特により複雑な設定ではいくつかの利点がありますが、設定では戻りコードが正常に機能するほどシンプルに聞こえます。

口の中で泡立って例外を主張する人もいますが、私のプロジェクトでは、戻りコードの単純さを好む人がいて、全体としてより良い選択になっています。

これはかなり興味深い質問です。そのため、おそらく「100%正しい」答えはありません。ほとんどの場合、関数を使用するコードをどのように構成すべきかによって異なります。

私が見ているのは、関数を呼び出すコードに「悲惨な」状況から安全に脱出する方法を提供したい場合にのみ例外を使用するということです。ですから、私のコードでは、何か本当に本当に本当に恐ろしいことが起こり、呼び出し元が知る必要があるときに例外をスローします。

今、あなたが持っているものが正常で、予想される状況であれば、おそらくエラー値を返すべきです。そうすれば、コードは「一生懸命に試す」必要があることを認識しますが、何が起こっても妥協することはありません。

たとえば、タイムアウトを予期したとおりに処理し、エラーコードと、呼び出しコードが戻るために追加のアクションを実行する必要があるより深刻な問題(完全な送信バッファーなど)を返すことができます例外として「通常」に。

しかし、美しさは見る人の目にあり、例外を使用するように言う人もいれば、リターンコードのみを使用する人(ほとんどCプログラマー)もいます。ただし、例外は常に例外的であることを忘れないでください。 :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top