我是否应故意检查检查异常?

时间:2011-05-26 20:58:03

标签: java exception

我设计了一个上传文件处理如下:

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的每个方法。

6 个答案:

答案 0 :(得分:2)

例外条件应使用例外。你不希望发生的事情。

你不应该将它们用于条件逻辑。

Josh Bloch特别在他的书中概述了这一点,这本书非常好并且是必须的恕我直言:

http://java.sun.com/docs/books/effective/

答案 1 :(得分:2)

since we should not catch unchecked exceptions.

没有这样的规则。只要您知道如何处理它,就会发现任何异常。

然而,绝不能捕捉到错误!

答案 2 :(得分:0)

我认为你最好让check()返回一个布尔值 我相信这会使代码看起来更干净,就像Brian说的那样 - 例外并不是真正的逻辑 - 他们会在出现意外错误的时候做出反应。

答案 3 :(得分:0)

如果你得到例外,你会做什么吗?如果没有,让它泡沫。如果你是那么你当然可以捕获一个uncheck异常。

答案 4 :(得分:0)

就个人而言,我认为它应该是一个经过检查的例外。你应该是好的。从每个文件处理方法中抛出它并在UploadedFileHandler中捕获它,正确处理它,如果你需要不同的处理逻辑,那么将BadUploadedFileException拆分成许多不同类型的异常。

有关已检查和未检查的例外here的更多信息。

答案 5 :(得分:0)

最后一个选项会更好。我认为它不会让代码更难阅读,至少你(以及即将推出的版本中的同事)会记得处理它。

除此之外,当然不禁止捕获从RuntimeException派生的异常。另一方面,捕获RuntimeException或Exception只能在main方法中完成(例如,它可能是OutOfMemoryException!)。

如果使用显式的RuntimeExceptions,请不要在方法规范中使用“throws”关键字,但如果它们看起来很重要,请将它们包含在JavaDoc中。