2016-12-03 1 views
0

私はメッセージライブラリで作業しています。オブジェクトのsendメソッドは、ソケットが閉じられているなど、いくつかの理由で失敗する可能性があります。常に連鎖する例外をスローするのは意味がありますか?

実行時例外を除いてチェック例外が優先されますが、根本的な例外が常により一般化された別の例外に包まれるように、早期に連鎖を優先させる方が適切です。

たとえば、メッセージはSendFailedExceptionと表示されますが、cause()SocketClosedExceptionのように具体的になります。これは、チェックされた例外をすべて個別にスローするよりも煩雑にならないように感じます。

他のメソッドでも同様にSocketClosedExceptionがスローされるため、継承はここではうまくいきません。そして、閉じられた例外はすべて、送信失敗の結果ではありません。

さらに詳しい情報をcause()にラップするのが適切なのでしょうか、それとももっと混乱するでしょうか?私は野生でこのように機能する例外を発見したことを思い出しませんが、これは他の人にとっては慣習的でなく混乱するかもしれません。

これまでJavaや他のライブラリはこれを行っていますか?私のユースケースには適切ですか?

+2

正常にチェック(またはチェックされていない)例外を持つほとんどすべてのライブラリは、継承を介して独自の例外階層を定義します。そして、例外が再起される必要があるときはいつでも、原因として使用する必要があります。それが原因です。 – zapl

+0

'すべての閉じられた例外は送信失敗の結果ではありません.'閉じた例外が送信失敗ではない例を挙げることができますか? –

+0

クローズされたソケットから無効な状態を問い合わせようとしているときに、クローズされた例外がスローされることがあります。 – Zhro

答えて

0

原因()または にさらに情報を書き込むことは適切でしょうか?

あなたは常にスタックトレースでの例外のルート/起源についての詳細を提供します元の例外をラップするcauseを使用することができます。例外をラップする原因を設定する方法を説明するException API hereを参照できます。

これまでJavaや他のライブラリでこれを行っていますか?私の ユースケースには適していますか?多くの図書館で

、このパターンは、ちょうどピンポイントに、春-MVCでは、NestedServletExceptionが原因で元の例外をラップするコンテナによってスローされます、続いています。はい、あなたのケースでは、SocketClosedExceptionとして原因を設定してSendFailedExceptionを投げることができます。

また、あなたのメッセージ・ライブラリーは、第三者からのものである場合、サードパーティExceptionクラスは、プロジェクト/クラスにまたがっていないということではなく、あなたのコードがないように、彼らはあなた自身のExceptionクラスに変換/ラップ確保サードパーティのExceptionクラスと緊密に結合されています(移行する必要がある場合でも)。

関連する問題