2

我有一个关于异常处理程序的问题。我的项目有一个结构化代码,其中有许多用于不同目的的包和类。在这段代码中,我尝试在很多地方捕获不同类型的异常。提到其中的一些是SAXException, IOException, NumberFormatException, ParserConfigurationException,RuntimeException等等。

在我捕获异常的所有情况下,我只打印一个堆栈跟踪。当我遇到异常时,我会从堆栈跟踪中找出它发生的函数并相应地修复它。除了我不打算做任何事情,我也不打算做任何其他事情,因为代码量并不大,而且对我来说很容易调试。

现在,我正在使用第三方开发人员提供的外部 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.
}

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

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

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

谢谢!

4

2 回答 2

2

如果您不介意程序在任何异常后退出,您可以使用全局异常处理程序。您可能必须将throws Exception(或更具体的异常类)放在一大堆地方(以防止未处理的异常编译时错误),这远非理想(最终可能会得到比捕获更少的“漂亮”代码抛出它们的异常)。

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

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

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

于 2013-02-07T16:17:26.673 回答
2

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

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

请注意,这避免了吞下 3rd 方库抛出的异常,并且不会强制客户端处理 CheckedIOException等异常SQLException

于 2013-02-07T16:32:53.063 回答