我想捕获异常,记录它,设置一个标志,并重新抛出相同的异常
我有这段代码:
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,如果有异常则记录它
另一方面,我可以将异常包装在另一个异常中,但我不能抛出相同的异常。
任何想法?
答案 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)
我认为这里有各种各样的事情要提到:
doJobWithResult()
在成功时返回true,在失败时返回false,或者在成功时返回任何内容并在失败时抛出异常。
两者同时是不可能的。在第一种情况下,捕获异常,记录它并返回false,在第二种情况下,更改签名以返回void
并抛出 异常并在调用者中处理它。Exception
不会给你的方法的调用者任何关于你的方法可能出错的线索,最好抛出更多特定的异常,或者在用户定义中包装异常一个并重新抛出它。Exception
,调用者可能会想要抓住Exception
而没有注意到它也会捕获每个RuntimeException(因为它派生自Exception
),这可能不会是理想的行为。答案 3 :(得分:3)
如果doJobWithResult不必处理异常,则删除catch块并将“throws Exception”添加到方法签名中。异常日志记录可以在必须在相应的try / catch块中处理Exception的类/方法中完成。
答案 4 :(得分:2)
由于Exception
为checked,因此捕获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);