java:无法重新抛出异常:未处理的异常类型异常

时间:2012-02-29 05:57:25

标签: java exception exception-handling

我想捕获异常,记录它,设置一个标志,并重新抛出相同的异常

我有这段代码:

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中抱怨,告诉“Unhandled exception type Exception”,并建议我在它周围添加一个try-catch块。

实际上,我希望调用此方法的进程能够处理异常,而不是自己处理它......如果一切正常,我只想返回true,如果有异常则记录它

另一方面,我可以将异常包装在另一个异常中,但我不能抛出相同的异常。

任何想法?

9 个答案:

答案 0 :(得分:8)

你的doJobWithResult方法需要声明它可以抛出异常:

public Boolean doJobWithResult() {

变为

public Boolean doJobWithResult() throws Exception {

答案 1 :(得分:5)

如果将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)。 / p>

答案 2 :(得分:4)

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

  1. 您希望doJobWithResult()在成功时返回true,在失败时返回false,或者在成功时返回任何内容并在失败时抛出异常。 两者同时是不可能的。在第一种情况下,捕获异常,记录它并返回false,在第二种情况下,更改签名以返回void并抛出 异常并在调用者中处理它。
  2. 不要捕获异常,记录并重新抛出异常。为什么?因为您的方法的潜在调用者不知道您已经记录它,并且也记录它。 抛出一个异常(在这种情况下调用者必须处理它)或捕获并处理它(记录它)。
  3. 请注意,抛出Exception不会给你的方法的调用者任何关于你的方法可能出错的线索,最好抛出更多特定的异常,或者在用户定义中包装异常一个并重新抛出它。
  4. 此外,如果你抛出Exception,调用者可能会想要抓住Exception而没有注意到它也会捕获每个RuntimeException(因为它派生自Exception),这可能不会是理想的行为。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

由于Exceptionchecked,因此捕获Exception的替代方法是将您的方法声明为抛出它:

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

答案 5 :(得分:2)

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

您的方法还应该声明它会抛出异常,因此客户端将被强制处理它。

还要考虑使用更具体的异常,在这种特殊情况下会抛出异常。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

我从有效的java书中得到的另一件事是,如果你编写这样的方法,你必须用@throw(在评论中)记录原因。

答案 8 :(得分:0)

您可以抛出未经检查的异常

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