2011-11-01 81 views
10

我审查一个同事的代码和我遇到类似这样的一段代码:是“抛出异常”不好的做法?

public X Foo1(Y y) throws Exception { 
    X result = new X(y); 
    result.Foo2(); 
    return result; 
} 

我认为没有必要为throws Exception一部分,但我有困难证明这一。这可能是有道理的,如果它更具体ExceptionFileNotFound,NoMemory等),但因为它是我认为这是没有必要的。有人能给我一些原因,这可能导致什么问题,为什么这是不好的做法?或者这段代码好吗?

回答

26

throws声明是方法合同的一部分。在定义合同时,应始终尽可能精确地为。因此说throws Exception是一个坏主意。

由于同样的原因,不好的做法是说一个方法在返回String时返回Object。此外,该方法的调用者必然要赶上Exception(除非他想传播这种丑陋),并且捕捉Exception也是一个坏主意。请参阅此问题的答案:Is it a bad practice to catch Throwable?

+3

+1我可以想到几个实际的原因,但是这个答案包含了所有这些。 – MByD

5

这会强制每个使用此方法的人处理抛出的异常。

即使你喜欢使用检查过的异常(我不这样做),这会让你根本没有任何信息可能会出现什么样的错误。所以你不能真正以有意义的方式处理它。

1

抛出声明表示: - 你的方法里面的东西可能会产生这样的检查的异常 - 你的方法是不能或不愿对付它

您应使用最具体的异常,抵制诱惑,不相关的组减少抛出声明数量的异常。如果你觉得它们太多,那么你的方法过于复杂,应该分解成更小的更易于管理的方法。