我对异常处理程序有疑问。
我有一个用于我的项目的结构化代码,它有许多用于不同目的的包和类。
在这段代码中,有很多地方我尝试捕获不同类型的异常。
其中一些是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.
}
鉴于这种情况,我应该切换到this discussion中提到的全局异常处理程序吗?
这会避免在我的代码中到处写try / catch块吗?
另外,我应该删除现有的try / catch块吗?
谢谢!
答案 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);
}
}
请注意,这可以避免吞噬第三方库引发的异常,并且不会强制客户端处理IOException
,SQLException
等已检查的异常。