在Java库最佳实践中抛出异常

时间:2015-04-09 08:54:24

标签: java jar exception-handling

我正在开发一个用于数据库访问的JAR库。我首先捕获了try块中的所有异常并处理它们。 但后来,我认为它会更好,因为它的库会将异常抛给最终程序员来捕获它并进行处理。

有关处理JAR文件中的异常的最佳做法是什么?

以下是我的JAR中的示例代码,正如您所看到的,抛出了许多异常。这是一个很好的做法还是有办法更好地做到这一点? (比如定义一个新的自定义异常;如果是这样,它是如何完成的?) 任何有关这方面的帮助都非常感谢。

 public static NConnection getNConnection(String path) throws IOException, ParserConfigurationException, SAXException {

    NConfigurations conf = new NConfigurations();
    conf.setConfigurationLoc(path);
    String dbPath = conf.getDatabasePath();
    return createConnection(dbPath);
}

4 个答案:

答案 0 :(得分:1)

没有简单的答案,社区在某种程度上尚未确定什么是最佳实践。简而言之,如果您想强制调用者处理出错的情况/让他有机会从这种异常状态中恢复,您可以使用已检查的异常使用运行时异常用于任何其他情况,例如违反合同等编程错误。

在我看来,任何库的最佳实践都是扩展自己的异常类,即使它只包装原始异常。这样 - 作为客户端 - 我可以读取堆栈跟踪并轻松发现我的代码中哪些部分出错。例如。如果存在DBFrameworkException,则比常见的NullPointerException更清晰。

另请参阅Bloch's Effective Java第58项,了解有关此主题的一些有用的解释。

答案 1 :(得分:1)

在我看来,你应该捕获所有潜在的异常,例如你在方法签名中的异常(例如IOException),然后如果需要,你可以使用你觉得合适的消息和类型抛出自己的自定义异常。

这样做的原因与良好的编程习惯有关,您可能希望用以前的其他东西替换您以前使用的库(例如jdbc驱动程序)。您不希望用户代码在导入新版本时中断,比如说您可能正在使用通用的重复键异常,而是使用MySQL重复键错误。

答案 2 :(得分:1)

我认为投掷是一种更好的方法,因为使用jar的人可以在java类中处理这些异常。就像DriverManage.getConnection()抛出ClassNotFoundException。

答案 3 :(得分:1)

您可以双向执行:您可以抛出原始异常,也可以将它们嵌套在自己的自定义异常中。这是一个设计决定。

通常将逻辑上与代码功能相关的异常抛出是有意义的。对于前者如果你进行I / O操作,你会发现IOException,因为这是i / o操作可能引起的自然问题。

在你的情况下:它取决于NConnection抽象的全部内容。如果该实现具体,那么暴露IOException可能没有意义。您可以创建自己的特定于应用程序的异常并包装io异常:

try {
   // code that throws i/o exception 
} catch (IOException ioe) {
   throw new NException("Something went wrong", ioe);
}