在 Java 库最佳实践中抛出异常
Throwing exceptions in a Java Library Best Practice
我正在开发用于数据库访问的 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);
}
这个问题没有简单的答案,社区在某种程度上不确定什么是真正的最佳实践。简而言之,如果您想强制调用者处理出现问题的情况/让他有机会从这种异常状态中恢复,您可以使用已检查的异常。 使用运行时异常 用于任何其他情况,例如违反合同等编程错误。
在我看来,任何库 扩展自己的异常 class 都是最佳做法,即使它只是包装原始异常。这样 - 作为客户 - 我可以阅读堆栈跟踪并轻松发现我的代码的哪一部分出了问题。例如。如果有 DBFrameworkException 它比常见的 NullPointerException 更清楚。
另请参阅 Bloch's Effective Java 项目 58,了解有关此主题的一些很好的解释。
在我看来,您应该捕获所有底层异常,例如您在方法签名中的异常(例如 IOException),然后如果需要,您可以使用您认为合适的消息和类型抛出您自己的自定义异常。
这样做的原因与良好的编程习惯有关,您可能希望用其他东西替换您以前使用的库(例如 jdbc 驱动程序)。您不希望用户代码在导入新版本时中断 MySQL 重复键错误,而您可以使用通用重复键异常。
我认为 throwing 是一种更好的方法,因为使用 jar 的人可以像 DriverManage.getConnection 一样处理 java classes.Just 中的那些异常() 抛出 ClassNotFoundException。
两种方法都可以:您可以抛出原始异常,也可以将它们嵌套在您自己的自定义异常中。这是一个设计决定。
通常抛出与代码功能逻辑相关的异常是有意义的。对于前。如果您执行 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);
}
我正在开发用于数据库访问的 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);
}
这个问题没有简单的答案,社区在某种程度上不确定什么是真正的最佳实践。简而言之,如果您想强制调用者处理出现问题的情况/让他有机会从这种异常状态中恢复,您可以使用已检查的异常。 使用运行时异常 用于任何其他情况,例如违反合同等编程错误。
在我看来,任何库 扩展自己的异常 class 都是最佳做法,即使它只是包装原始异常。这样 - 作为客户 - 我可以阅读堆栈跟踪并轻松发现我的代码的哪一部分出了问题。例如。如果有 DBFrameworkException 它比常见的 NullPointerException 更清楚。
另请参阅 Bloch's Effective Java 项目 58,了解有关此主题的一些很好的解释。
在我看来,您应该捕获所有底层异常,例如您在方法签名中的异常(例如 IOException),然后如果需要,您可以使用您认为合适的消息和类型抛出您自己的自定义异常。
这样做的原因与良好的编程习惯有关,您可能希望用其他东西替换您以前使用的库(例如 jdbc 驱动程序)。您不希望用户代码在导入新版本时中断 MySQL 重复键错误,而您可以使用通用重复键异常。
我认为 throwing 是一种更好的方法,因为使用 jar 的人可以像 DriverManage.getConnection 一样处理 java classes.Just 中的那些异常() 抛出 ClassNotFoundException。
两种方法都可以:您可以抛出原始异常,也可以将它们嵌套在您自己的自定义异常中。这是一个设计决定。
通常抛出与代码功能逻辑相关的异常是有意义的。对于前。如果您执行 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);
}