如何以一种好的 Java 方式处理异常引起的原因

Posted

技术标签:

【中文标题】如何以一种好的 Java 方式处理异常引起的原因【英文标题】:How to handle cause by Exception in a good Java way 【发布时间】:2015-03-25 03:58:00 【问题描述】:

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

我有两个 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

【问题讨论】:

在第一个 catch 块中尝试 SocketTimeoutException | PrivilegedActionException 吗?阅读更多Java find the first cause of an exception 仅针对其他查看者,我使用的是 java 1.6 .....不支持此功能.... 【参考方案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
    

【讨论】:

感谢您的回答,但是 pham 我说过我的编译器不允许我捕获 PrivilegedActionException,因为我编写的代码尝试捕获它没有抛出 PrivilegedActionException @AbhishekSuthar 所以只需捕获正确的异常,并应用相同的逻辑来找出原因:) 基本思想是您需要调用 getCause 来获得您想要的。 你是说把这段代码放在异常的捕获中? @AbhishekSuthar 这种方法应该可行,只是在代码中看起来很丑:( @AbhishekSuthar 在catch Exception 中添加了一个建议您如何做到这一点【参考方案2】:

最好定义自己的异常类并执行所需的操作。

请确保在抛出异常之前释放您在程序中使用的所有资源。

【讨论】:

以上是关于如何以一种好的 Java 方式处理异常引起的原因的主要内容,如果未能解决你的问题,请参考以下文章

使用面部标志进行面部裁剪

NHibernate与多个值的三元关联 - 如何以一种很好的方式映射

在带弹簧休息的全局异常处理程序中使用通用异常类处理程序是一种好习惯吗?

Java 异常处理

Java异常

Java异常