Java错误处理
我相信大家都知道,Java对错误处理实施了非常严格的模式,因此任何异常都必须通过try-catch块或通过使用throws关键字声明方法来处理。(我可以补充说,我真的很喜欢它的制作方式) 话虽如此,;我所要做的是决定如何正确处理各种方法中的错误。我来自C#/VB.NET的背景,以前一直严格坚持在堆栈的最底层处理错误(除了最具体的情况),但是我不相信这是Java中最好的方法Java错误处理,java,design-patterns,error-handling,Java,Design Patterns,Error Handling,我相信大家都知道,Java对错误处理实施了非常严格的模式,因此任何异常都必须通过try-catch块或通过使用throws关键字声明方法来处理。(我可以补充说,我真的很喜欢它的制作方式) 话虽如此,;我所要做的是决定如何正确处理各种方法中的错误。我来自C#/VB.NET的背景,以前一直严格坚持在堆栈的最底层处理错误(除了最具体的情况),但是我不相信这是Java中最好的方法 有人能提供有关这方面的信息吗?什么是最佳实践?如何决定是否应该在方法外部抛出异常,还是在内部处理异常(显然有些情况很明显,但
有人能提供有关这方面的信息吗?什么是最佳实践?如何决定是否应该在方法外部抛出异常,还是在内部处理异常(显然有些情况很明显,但allot不是)?这是一个老生常谈的答案,但是在您可以实际使用异常进行恢复的情况下捕获异常。不同的异常将意味着您可以在体系结构中的不同级别处理异常。您希望在异常发生的地方处理异常,前提是,并且仅当您确实可以采取措施修复异常时 下面是一个常见的例子:
int foo(String userInput) {
int i = Integer.parseInt(userInput);
return i * 4;
}
这将抛出除非数字的字符串输入之外的字符串。但你对此无能为力,所以你就让它散播出去
这是另一个例子
class Communicator {
private InputStream in;
private OutputStream out;
public Communicator(Socket socket) throws IOException {
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
}
}
如果套接字抛出IOException,您是否可能期望恢复并使通信器仍然工作?我想不是。让它去吧,让它传播,让它找到一个能处理它的人
另外,您应该知道,对于所有异常,您不必
捕获
或声明抛出
。如果是运行时异常
,则不需要这样做。对于大多数部分,这些异常通常意味着错误(NullPointerException,有人吗?)或错误的用户输入(NumberFormatException)。基于每个方法,我问自己:
这似乎是处理错误的一种很好的通用方法。谢谢大家!@b邮件能否请您在回答中再解释一下
rethrow
(2)?@JJD例如,SAXParser.parse方法可能会捕获IOException(例如,日志记录、清理等),但它们会重新显示异常,因为调用方有上下文来处理它(例如,FileNotFoundException,或最终用户可能知道如何解决的其他一些I/O问题)。