我在try-catch中有一些代码,在那段代码中我正在调用web服务。在Web服务上我设置了超时。
我有两个Web服务调用一个没时间工作正常另一个需要很长时间才能响应问题不是那个但是因为超时它应该抛出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
答案 0 :(得分:1)
您可以抓住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
}
}
答案 1 :(得分:0)
最好定义自己的Exception类并执行所需的操作。
在抛出异常之前,请确保释放您在程序中使用的所有资源。