2012-02-29 126 views
7

我想捕捉异常,记录它,设置一个标志,并且重新抛出同样的异常的java:不能重新抛出异常:未处理的异常类型异常

我有这样的代码:

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw ex; 
    } 
    return result; 
} 

但是eclipse在throw ex时抱怨告诉“未处理的异常类型异常”,并建议我在它周围添加一个try-catch块。

其实,我想要的进程调用这个方法来处理异常,而不是处理它自己......我只是想,如果一切正常的话,如果有异常

在返回true,并将其记录另一方面,我可以把例外包装在另一个例外中,但我不能扔同一个例外。

任何想法?

回答

2

我认为有各种各样的事情在这里提到:

  1. 要么你想doJobWithResult()返回成功真假失败或成功返回任何结果,失败抛出异常。 两者在同一时间是不可能的。在第一种情况下,捕获异常,记录它并返回false,在第二种情况下更改签名返回void,并抛出一个异常和来电处理。
  2. 这是一个不要捕捉异常,登录并重新抛出。为什么?因为您的方法的潜在调用者不知道您已经记录它,并且还记录它。 要么抛出一个异常(在这种情况下,调用者必须处理它)或抓住它并处理它(记录它)。
  3. 注意扔Exception不给你的方法的调用什么可能潜在地去错在你的方法任何线索,它总是更好地抛出更具体的异常,或在用户定义的一个包装异常,并重新抛出。
  4. 此外,如果抛出Exception,调用者可能会试图捕获Exception,但不会注意到这也会捕获每个RuntimeException(因为它从Exception派生),这可能不是所期望的行为。
+0

所有的答案是非常有用的,我想这其中也提供了有关如何处理例外的几点提示... – opensas 2012-02-29 13:45:19

2

由于Exceptionchecked,再追一个替代的Exception是宣布你的方法把它扔:

public Boolean doJobWithResult() throws Exception { 
    // ... 
} 
7

你doJobWithResult方法需要声明的是它能够抛出异常:

public Boolean doJobWithResult() { 

变成

public Boolean doJobWithResult() throws Exception { 
3

如果doJobWithResult不必处理异常,则删除catch块并向方法签名添加“throws Exception”。异常日志记录可以在必须在相应的try/catch块中处理异常的类/方法中完成。

2

没有必要在catch块中将结果设置为false,因为值不会被返回(因为我们抛出异常)。

你的方法还应该声明它抛出一个异常,所以客户端将被迫处理它。

另外考虑使用一个更具体的例外,这将在这种特殊情况下抛出。

4

如果您将throws Exception添加到您的方法签名中,则可以抛出相同的异常。 否则你可以扔RuntimeException

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw new RuntimeException(ex); 
    } 
    return result; 
} 

在这种情况下,你不会需要指出public Boolean doJobWithResult()抛出的东西,但要确保你处理得当以后(捕或希望您的线程停止......这是一个RuntimeException毕竟)。

0

你可以抛出一个未经检查的异常

Logger.info("fetching feed(%d) failed", feedId); 
throw new RuntimeException(ex); 
1

添加throws Exception到你的方法。您也不需要在catch区块中添加result = false;

1

我认为如果feed.fetchContents()方法的任何失败都无法恢复,那么处理这个异常的方式非常合适。(主意更好地停止而不是继续) 除此之外,我建议您使用更具体的异常层次结构。

而另一件事我从有效的Java书得到的是,如果你写你必须@throw文件(评论)与等原因的方法。