2

try-catch にいくつかのコードがあり、そのコードで Web サービスを呼び出しています。Web サービスでタイムアウトを設定しました。

私は2つのWebサービス呼び出しを持っています.1つは問題なく動作し、もう1つは応答に時間がかかりますが、タイムアウトのためにSocketTimeoutExceptionをスローする必要がありますが、PrivilegedActionExceptionをスローし、長いスタック状態の後、SocketTimeoutExceptionによる原因を示しています。

SocketTimeoutException を取得するために意図的にサービス呼び出し時間を非常に短くしましたが、PrivilegedActionException をプライマリ例外として与えています。

SocketTimeoutException をキャッチしたいのですが、PrivilegedActionException を示すコード レベルでは、この try catch によってスローされていないことを示しているため、PrivilegedActionException をキャッチできません。

目標を達成するために以下のコードを書きましたが、機能していません

try {
  //some code here for service call
}catch(SocketTimeoutException e)
{
  //not able to come here even though cause of the PrivilegedActionException is SocketTimeoutException 
}
catch(Exception e)
{
  //directly coming here OF COURSE
}

スタックトレース:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
4

2 に答える 2

1

をキャッチし、 getCausePrivilegedActionExceptionを呼び出して を取得できます。直接の原因でない場合は、while ループが必要になる可能性があります。SocketTimeoutExceptionSocketTimeoutException

try{

}catch(PrivilegedActionException e){
    Throwable tmp = e;
    while(tmp != null){
        if(tmp instanceof SocketTimeoutException){
            SocketTimeoutException cause = (SocketTimeoutException) tmp;
            //Do what you need to do here.
            break;
        }
        tmp = tmp.getCause();
    }
}

一時的な解決策:

catch(Exception e){
    if(e instanceof PrivilegedActionException){
         //while loop here
    }
}
于 2015-03-25T04:05:26.300 に答える
0

独自の Exception クラスを定義し、必要な操作を実行することをお勧めします。

例外をスローする前に、プログラムで使用しているすべてのリソースを解放してください。

于 2015-03-25T04:17:40.523 に答える