java我应该故意捕获检查过的异常吗?
我设计了一个上传文件处理程序,如下所示:
UploadFileHandler是提供检查方法的主要类
public class UploadedFileHandler {
public static void handleUploadedFile(String fileName) {
try {
checkFile(fileName);
} catch (BadUploadedFileException ex) {
deleteFile(fileName);
}
}
private static void checkFile(String fileName) {
new UploadedFileChecker(fileName).check();
}
private static void deleteFile(String fileName) {
//...code to delete the file.
}
}
上传的文件检查器进行检查
public class UploadedFileChecker {
private String fileName;
public UploadedFileChecker(String fileName) {
this.fileName = fileName;
}
public void check() throws BadUploadedFileException {
checkFileFormat();
scanVirus();
}
private void checkFileFormat() {
// if file format unsupported
throw new BadUploadedFileException();
}
private void scanVirus() {
// if contains virus
throw new BadUploadedFileException();
}
}
BadUploadedFileException声明如下:
public class BadUploadedFileException extends RuntimException {
}
我让它扩展RuntimeException,因为它使UploadedFileChecker中的代码干净,但这样做会使它成为未经检查的异常。因此,handleUploadedFile中的catch是不恰当的,因为我们不应该捕获未检查的异常
我的问题是,我应该捕获BadUploadedFileException还是让它扩展Exception并将“throws BadUploadedFileException”附加到UploadedFileChecker的每个方法中
# 1 楼答案
我想你最好让
check()
返回一个布尔值我相信这会让代码看起来更干净,就像Brian所说的——异常并不是真正的逻辑——它们是针对出现意外错误的情况
# 2 楼答案
最后一种选择更可取。我不认为这会让代码更难阅读,至少你(以及你在即将发布的版本中的同事)会记得处理它
除此之外,当然也不禁止捕获从RuntimeException派生的异常。另一方面,捕获RuntimeException或Exception应该只在main方法或类似的方法中完成(它可能是OutOfMemoryException!)
如果使用显式运行时异常,请不要在方法规范中使用“throws”关键字,但如果它们看起来很重要,请在JavaDoc中包含它们
# 3 楼答案
没有这样的规则。只要你知道如何处理,你就会捕捉到任何异常
然而,一个人永远不能犯错误
# 4 楼答案
如果你有例外,你会做什么吗?如果没有,就让它冒泡吧。如果你是,那么你肯定可以捕捉到一个未选中的异常
# 5 楼答案
就我个人而言,我认为这应该是一个例外。你应该问。从每个文件处理方法中抛出它,并在UploadedFileHandler中捕获它,适当地处理它,如果需要不同的处理逻辑,则将BadUploadedFileException拆分为许多不同类型的异常
有关已检查和未检查异常的更多信息here
# 6 楼答案
异常应用于异常情况。你不希望发生的事情
你不应该把它们用于条件逻辑
乔希·布洛赫在他的书中特别概述了这一点,这本书相当不错,是IMHO的必备之作:
http://java.sun.com/docs/books/effective/