如何以良好的 Java 方式处理异常引起的问题
How to handle cause by Exception in a good Java way
我在 try-catch 中有一些代码,在该代码中我正在调用网络 service.On 我已设置超时的网络服务。
我有两个 Web 服务调用,一个没有花时间正常工作,另一个需要很长时间才能响应问题不是那个,而是因为超时,它应该抛出 SocketTimeoutException 但它抛出 PrivilegedActionException 并且在长时间堆栈之后它的显示 SocketTimeoutException 的原因。
我故意将服务调用时间设置得非常短以获得 SocketTimeoutException 但它给我 PrivilegedActionException 作为主要异常。
我想捕获 SocketTimeoutException 但我无法捕获 PrivilegedActionException,因为在代码级别它显示的 PrivilegedActionException 没有被这个 try catch 抛出。
我已经编写了以下代码来实现我的目标,但它不起作用
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
}
}
最好定义自己的异常 class 并执行所需的操作。
只需确保在抛出异常之前释放您在程序中使用的所有资源。
我在 try-catch 中有一些代码,在该代码中我正在调用网络 service.On 我已设置超时的网络服务。
我有两个 Web 服务调用,一个没有花时间正常工作,另一个需要很长时间才能响应问题不是那个,而是因为超时,它应该抛出 SocketTimeoutException 但它抛出 PrivilegedActionException 并且在长时间堆栈之后它的显示 SocketTimeoutException 的原因。
我故意将服务调用时间设置得非常短以获得 SocketTimeoutException 但它给我 PrivilegedActionException 作为主要异常。
我想捕获 SocketTimeoutException 但我无法捕获 PrivilegedActionException,因为在代码级别它显示的 PrivilegedActionException 没有被这个 try catch 抛出。
我已经编写了以下代码来实现我的目标,但它不起作用
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
}
}
最好定义自己的异常 class 并执行所需的操作。
只需确保在抛出异常之前释放您在程序中使用的所有资源。