我设计了一个上传文件处理如下:
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.
}
}
UploadedFileChecker会进行检查。
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的每个方法。
答案 0 :(得分:2)
例外条件应使用例外。你不希望发生的事情。
你不应该将它们用于条件逻辑。
Josh Bloch特别在他的书中概述了这一点,这本书非常好并且是必须的恕我直言:
答案 1 :(得分:2)
since we should not catch unchecked exceptions.
没有这样的规则。只要您知道如何处理它,就会发现任何异常。
然而,绝不能捕捉到错误!
答案 2 :(得分:0)
我认为你最好让check()
返回一个布尔值
我相信这会使代码看起来更干净,就像Brian说的那样 - 例外并不是真正的逻辑 - 他们会在出现意外错误的时候做出反应。
答案 3 :(得分:0)
答案 4 :(得分:0)
就个人而言,我认为它应该是一个经过检查的例外。你应该是好的。从每个文件处理方法中抛出它并在UploadedFileHandler中捕获它,正确处理它,如果你需要不同的处理逻辑,那么将BadUploadedFileException拆分成许多不同类型的异常。
有关已检查和未检查的例外here的更多信息。
答案 5 :(得分:0)
最后一个选项会更好。我认为它不会让代码更难阅读,至少你(以及即将推出的版本中的同事)会记得处理它。
除此之外,当然不禁止捕获从RuntimeException派生的异常。另一方面,捕获RuntimeException或Exception只能在main方法中完成(例如,它可能是OutOfMemoryException!)。
如果使用显式的RuntimeExceptions,请不要在方法规范中使用“throws”关键字,但如果它们看起来很重要,请将它们包含在JavaDoc中。