RMIとチェーンの例外に悪い考え?
-
20-08-2019 - |
質問
それはRemoteExceptionsを投げたときに、例外チェーンを使用することは悪い考えますか?私たちはこのような何かを行うRMIサーバを持っています:
public Object doSomething() throws RemoteException
{
try
{
return getData();
}
catch (CustomException ex)
{
throw new RemoteException(ex);
}
}
私は私のクライアントでのClassNotFoundExceptionによって引き起こさUnmarshallExceptionを取得しています。プラス側では、CustomException自体が輸出されていることが判明しました。 。にClassNotFoundExceptionが入ってくるところ残念ながら、であるこの男がエクスポートされていない深い内部の別の例外は、私は、階層はこのようなものだと思います:
はRemoteException - > CustomException - >のSQLException - > NotExportedException
私が見る問題は、我々はCustomExceptionがエクスポートされることを保証できるにもかかわらず、我々は任意の下位レベルの例外であることを保証できないということです。
私はこのためにRemoteExceptionsとの例外チェーンを使用しないでくださいに傾いています。代わりに、私はおそらく、サーバー側のスタックトレースをログに記録し、それにチェーンなし「原因」の例外を除いて、プレーン、バニラRemoteExceptionを投げるべきだと思います。誰もが前にこのような状況に対処?
解決
むしろのRemoteExceptionでCustomExceptionをラップよりも、あなたはこのようなあなたのリモートインタフェースを変更する可能性
interface Foo extends Remote {
Object doSomething() throws CustomException, RemoteException;
}
ここでの原則は、RMIランタイムがRemoteExceptionsを上げなければならないということです。彼らはリモートではなく、アプリケーションロジックに何らかの障害を知らせます。実際には、具体的な実装でも宣言する必要はありませんRemoteException
。
しかし、あなたのサービスがいくつかのサードパーティのライブラリーから例外をキャッチされたケースを処理しませんが、throws節でそれを公開したくない。
public Object doSomething() throws CustomException {
try {
return theirSvc.getData();
} catch (ThirdPartyException ex) {
throw new CustomException("Failed to obtain requested data.");
// or: throw new CustomException("Failed to obtain requested data.", ex) ?
}
}
この場合、私はあなたが依存関係がそうでない場合は、サードパーティのライブラリを知ってする必要がないだろう、クライアントで作成される「漏出抽象化を」、作成しないことをお勧めします。
通常、ログインするおよびの投げ同じエラーが繰り返し記録されますので、悪い習慣です。しかし、この場合には、私がスローされた例外をクライアントに転送されているので、それは、正当だと思います。クライアントとサーバーの両方でそれをログに記録することが有用であり得ます。だから、catchブロックは次のように見てしまいます:
catch (ThirdPartyException ex) {
String message = "Failed to obtain requested data.";
log.error(message, ex);
throw new CustomException(message);
}
この方法では、ThirdPartyException依存性は、サーバのログが適切な実装固有の情報が含まれていて、エラーが正しくクライアントに報告され、サーバーに制限されます。
他のヒント
私たちは、元の例外からのメッセージ+全体のスタックトレースをキャプチャし、リモート例外の内容としてそれを渡さ。あなたは、スタックのすべての詳細を取得していますが、非直列化可能であること内部の例外のいずれかの任意の心配する必要はありません。
その方法あなたはいくつかの他のサードパーティ製の内側にあるかもしれない他のどのオブジェクト分からない(あるいはあなた自身の「ファーストパーティ」カスタム例外!)