您基本上有两个不错的选择:
选择1:
如果你能合理处理异常,那么就这样做:
try {
String res = conn.getData(command);
} catch (IOException e) {
// do something sensible, perhaps return null or a default value etc
}
如果有意义,这通常是一个不错的选择,因为它不会给调用者带来任何处理异常的负担
选择 2:
如果您无法合理处理异常,请让您的方法抛出异常。这里的设计问题是你抛出什么异常?
如果异常“非常适合”您的代码的其余部分,只需声明您的方法以抛出来自 3rd 方库的预期异常:
public void processData(Connection conn, String command) throws IOException
但是,通常在调用 3rd 方库时,它抛出的异常与您的应用程序不兼容。在您的情况下,IOException
可能完全在您的应用程序的域之外,仅因为第 3 方的实现访问远程服务器(例如)而抛出,并且抛出IOException
会在您的代码中引入一个新异常,该异常与它的目的(例如,您的应用程序可能与使用远程服务器无关)。
在这些情况下,最好将异常包装在域异常中并抛出它。例如:
public void processData(Connection conn, String command) throws ProcessingException
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new ProcessingException(e);
}
}
为此,您将创建这样一个异常类:
public class ProcessingException extends Exception {}
现在你有了更多的选择。如果预计不会发生异常,换句话说,您已采取合理措施确保它不会发生(通过确保环境正确等),您可以选择抛出未经检查的异常:
public void processData(Connection conn, String command)
try {
String res = conn.getData(command);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这个版本基本上是在说这个异常不是预期的,我们不会为它编写代码,因为这种情况在任何级别都无法恢复,所以让它爆炸,它会在调用堆栈中冒泡,直到出现问题抓住Exception
。
这不是“反模式”,因为它与NullPointerException
所有其他常见的未经检查的异常并列,我们也没有捕捉到这些异常。