终止执行重写方法的最佳做法是什么? 以下是解释上下文的示例代码:
@Override
protected String doInBackground(String... params) {
URL serverURL = null;
try {
serverURL = new URL((urlString));
} catch (MalformedURLException e) {
e.printStackTrace();
}
...
...
return response.toJSONString();
}
在上面的代码片段中,我被迫捕获MalformedURLException,所以我使用了try catch块。如果发生异常,我想跳过catch块下面的所有代码并传播相同的异常或我将在catch块中抛出的另一个异常,直到一直到Main方法,跳过catch块和在所有调用方法中跳过中间的代码。怎么做?
问题是: 1)我不能将throws子句添加到方法签名中,因为它被覆盖并且基类不允许它。
2)由于该方法必须返回一个String,我必须在catch块之后指定return语句。(如果发生异常,我该返回什么?)
3)在catch块中使用System.exit - 正如此论坛上的其他帖子所指出的那样,当您希望代码可以重用时,这可能不是一个好习惯。
答案 0 :(得分:3)
这种情况的最佳做法是用MalformedURLException
包裹RuntimeException
:
catch (MalformedURLException ex) {
throw new RuntimeException("Failed constructing URL", ex);
}
理想情况下,您真的想编辑方法的throws
子句,以便它可以容纳任何可能源于覆盖的异常;但是因为在你的情况下这是不可能的(根据你的条件),上面对我来说似乎是最合理的。
相关的最佳做法是避免在包装之前记录异常。从设计的角度来看,没有必要这样做 - 调用者已经可以访问原始的Exception
对象(通过抛出的getCause()
的{{1}}方法),所以调用者应该决定是否记录它。