2

Hessian を使用して Web サービス呼び出しを行う Java 1.4 Web アプリがあります。可能な限り堅牢で透過的に記述しようとしています。プロキシを呼び出すときに、ヘッセン例外がデリゲート クラスから抜け出すことは望ましくありません。Hessian ランタイム例外をキャッチしてアンラップし、いくつかの主要な例外 (例: ConnectException) を再スローするか、別の例外で再ラップできるようにしたいと考えています。しかし、これらの例外を見つけるのは少し難しいです。

委任クラスにあるすべてのメソッドは、この種の構造を持っています。

public MyResult myMethod(MyArgsType myArgs)
        throws ConnectException
{
    try
    {
        return proxy.myMethod(myArgs);
    }
    catch (HessianRuntimeException ex)
    {
        Throwable cause = ex.getCause();
        if (cause instanceof ConnectException)
            throw (ConnectException)cause;
        throw new MyRuntimeException(cause);
    }
}

これは私自身のテストでは正常に機能していますが、他のいくつかのランタイム例外が発生しており、見逃しています。たとえば、 (リモート サーバーがダウンしていた) がHessianConnectionException原因で をスローする可能性があることが最近わかりました。SocketException今持っているものがそれをキャッチするだろうと私は完全に期待していました. はHessianConnectionExceptionから派生していないHessianRuntimeExceptionので、キャッチする例外を追加する必要があります。

public MyResult myMethod(MyArgsType myArgs)
        throws SocketException, ConnectException
{
    try
    {
        return proxy.myMethod(myArgs);
    }
    catch (HessianException ex) // HessianConnectionException derives from HessianException
    {
        Throwable cause = ex.getCause();
        if (cause instanceof SocketException)
            throw (SocketException)cause;
        throw new MyRuntimeException(cause);
    }
    catch (HessianRuntimeException ex)
    {
        Throwable cause = ex.getCause();
        if (cause instanceof ConnectException)
            throw (ConnectException)cause;
        throw new MyRuntimeException(cause);
    }
}

それは私には問題ありません、それは行われなければなりませんでした...しかし、それはどこで終わりますか? 知っておく必要があるその他のランタイム例外や、その根本的な原因に関するドキュメントが見つかりません。

ここにリストされている唯一のランタイム例外であるため、キャッチするだけで十分であるHessianExceptionことを願っています。しかし、これらの新しく発見された問題では、混合バッグのように見えるため、どの例外をアンラップしたいのかわかりません (私の知る限り、同じ問題の異なる表現でした)。HessianRuntimeExceptionSocketExceptionConnectException

プロキシを介してメソッドを呼び出すときにスローされるランタイム例外と、その根本的な原因に関するドキュメントはありますか?

4

1 に答える 1

0

Web検索などを行ったことがあると思いますので、探しているドキュメントが見つからない場合のフォールバックポジションです。

既存のキャッチの後、RuntimeExceptionをキャッチします。例外のクラス名が「Hessian」で始まるかどうかをテストするか、パッケージ名を確認してください。ヘッセが起源でない場合は、投げ直してください。

ヘッセの例外であることがわかったら、現在の戦略と同様のことを行うことができます。原因の連鎖を調べて、コンテキストで意味のあるもの、または少なくともヘッセ以外のパッケージからのものを探します。

于 2012-11-06T01:37:39.610 に答える