SocketTimeoutException

SocketTimeoutException

我在try-catch中有一些代码,在该代码中我正在调用Web服务。在Web服务上,我设置了超时时间。

我有两个Web服务调用,一个不花时间就可以正常工作,另一个不花很长时间来响应问题,并不是因为那儿超时,它应该抛出SocketTimeoutException而是它抛出了PrivilegedActionException,并且经过很长的堆栈之后,它的显示原因是SocketTimeoutException。

我故意将服务调用时间很短,以获取SocketTimeoutException,但它给了我PrivilegedActionException作为主要异常。

我想捕获SocketTimeoutException,但由于代码级显示其PrivilegedActionException没有被尝试捕获抛出,我无法捕获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

最佳答案

您可以捕获PrivilegedActionException,然后调用getCause获得SocketTimeoutException。如果SocketTimeoutException不是直接原因,则可能需要while循环。

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
    }
}

07-24 09:45