2011-05-26 61 views
0

我设计了一个上传的文件处理如下:我应该故意捕捉检查异常吗?

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 { 

} 

我让它,因为它使得UploadedFileChecker干净的代码,但这样做使它成为一个检查异常继承RuntimeException。因此,handleUploadedFile中的catch不适用,因为我们不应该捕获未检查的异常。

我的问题是,我是否应该捕获BadUploadedFileException或使其扩展Exception并将“抛出BadUploadedFileException”追加到UploadedFileChecker的每个方法。

回答

2

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

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

乔希布洛赫概述了特别是在他的书,这是非常出色的,必须具备恕我直言:

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

+1

同意,这是正确的。如果可以使用条件逻辑来避免异常,那就去做吧。 'void checkFileFormat'应该是'boolean isValidFormat()','void scanVirus()'应该是'boolean hasVirus()'。如果可以的话,在施工中自动完成这些工作,因为它是一个处理程序,然后只给用户这些已经评估过的东西。 – 2011-05-26 21:04:06

+0

谢谢克里斯 - 完美的例子。 – 2011-05-26 21:07:34

2
since we should not catch unchecked exceptions. 

没有这样的规定。每当你知道如何处理它时,你都会捕获任何异常。

但是,一定不要错误!

0

我想你会更好地让check()返回一个布尔值。
我相信这会让代码看起来更清晰,就像Brian说的那样 - 异常并不是真正的逻辑 - 当事情出乎意料地错误时,它们就是用来处理的。

0

如果遇到异常,你会做什么吗?如果没有,让它泡。如果你是那么你当然可以捕捉到一个不检查的例外。

0

个人而言,我认为这应该是一个检查异常。你应该问。将它从每个文件处理方法中抛出并将其捕获到UploadedFileHandler中,如果需要不同的处理逻辑,则将其适当地处理,然后将BadUploadedFileException分解为多种不同类型的异常。

有关已选中和未选中例外的更多信息here

0

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

除此之外,从RuntimeException派生异常并不禁止。另一方面,捕获RuntimeException或Exception只能在主要方法和类似方法中完成(可能是OutOfMemoryException!)。

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

+0

在我自己的回答中添加评论:我认为布莱恩是对的,这不是用例*。正如你明确检查格式和病毒,如果你找到一个,它不是一个例外。尽量避免抛出不必要的异常(如果只允许您在没有它们的情况下进行调试)。 – 2011-05-26 21:08:59