Java全局异常处理程序

时间:2013-02-07 16:04:24

标签: java

我对异常处理程序有疑问。 我有一个用于我的项目的结构化代码,它有许多用于不同目的的包和类。 在这段代码中,有很多地方我尝试捕获不同类型的异常。 其中一些是SAXExceptionIOExceptionNumberFormatExceptionParserConfigurationExceptionRuntimeException等等。

在我捕获异常的所有情况下,我只打印堆栈跟踪。当我遇到异常的那一刻,我将从堆栈跟踪中找出它发生的功能并相应地修复它。我没有做任何其他异常,也不打算做,因为代码大小不是很大,而且很容易为我调试。

现在,我正在使用由第三方开发人员提供的外部Java库。这个库会为我调用的每个可能的函数抛出异常。我试图在这个库上写一个包装器以便利用它。但是,由于这个库,我在代码中的任何地方都找到了try / catch块。

例如我的代码看起来像这样 -

Class Wrapper
{
     public void method1()
     { 
         ....
         try
         {
            ...
            third party library calls...
            ... 
         } catch (Exception e) { e.printStackTrace(); }

     }

     public void method2()
     { 
         ....
         try
         {
            ...
            third party library calls...
            ... 
         } catch (Exception e) { e.printStackTrace(); }

     }
     // ... and so on... there are 50-100 methods like this.
     // some are even one-liners.
}

鉴于这种情况,我应该切换到this discussion中提到的全局异常处理程序吗?

这会避免在我的代码中到处写try / catch块吗?

另外,我应该删除现有的try / catch块吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您不介意在任何异常后退出程序,则可以使用全局异常处理程序。您可能必须将throws Exception(或更具体的异常类)放在一大堆位置(以防止未处理的异常编译时错误),这远非理想(并且最终可能会更少& #34;漂亮"代码而不是捕获它们被抛出的异常。)

另一方面,如果您希望程序从错误中恢复(通常在生产级代码中需要),那么您需要适当放置try-catch语句(可能涉及try-catch)代码中的所有语句。)

例如,如果您收到IOException,您可能想要重试,或者如果您收到NumberFormatException,您可能想要通知用户输入无效并让他/她再试一次。

你不应该只删除try-catch语句,你应该看一下他们做了什么,这个行为是你想要的,以及它是否可以用替代解决方案重现(例如全局try-catch语句)。

答案 1 :(得分:1)

如果您不希望客户端代码处理已检查的异常,则可以在包装器中执行以下操作。

public void method1() {
     try {
        //3rd party code here....
     }
     catch(RuntimeException e){
         throw e;
     }
     catch(Exception e){
       throw new RuntimeException(e.getMessage(),e);
     }
}

请注意,这可以避免吞噬第三方库引发的异常,并且不会强制客户端处理IOExceptionSQLException等已检查的异常。