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