有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (6) 个答案

  1. # 1 楼答案

    我想你最好让check()返回一个布尔值
    我相信这会让代码看起来更干净,就像Brian所说的——异常并不是真正的逻辑——它们是针对出现意外错误的情况

  2. # 2 楼答案

    最后一种选择更可取。我不认为这会让代码更难阅读,至少你(以及你在即将发布的版本中的同事)会记得处理它

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

    如果使用显式运行时异常,请不要在方法规范中使用“throws”关键字,但如果它们看起来很重要,请在JavaDoc中包含它们

  3. # 3 楼答案

    since we should not catch unchecked exceptions.
    

    没有这样的规则。只要你知道如何处理,你就会捕捉到任何异常

    然而,一个人永远不能犯错误

  4. # 4 楼答案

    如果你有例外,你会做什么吗?如果没有,就让它冒泡吧。如果你是,那么你肯定可以捕捉到一个未选中的异常

  5. # 5 楼答案

    就我个人而言,我认为这应该是一个例外。你应该问。从每个文件处理方法中抛出它,并在UploadedFileHandler中捕获它,适当地处理它,如果需要不同的处理逻辑,则将BadUploadedFileException拆分为许多不同类型的异常

    有关已检查和未检查异常的更多信息here

  6. # 6 楼答案

    异常应用于异常情况。你不希望发生的事情

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

    乔希·布洛赫在他的书中特别概述了这一点,这本书相当不错,是IMHO的必备之作:

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