如何在Java中传播来自重写方法的异常

时间:2015-03-23 22:23:01

标签: java exception

终止执行重写方法的最佳做法是什么? 以下是解释上下文的示例代码:

@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 - 正如此论坛上的其他帖子所指出的那样,当您希望代码可以重用时,这可能不是一个好习惯。

1 个答案:

答案 0 :(得分:3)

这种情况的最佳做法是用MalformedURLException包裹RuntimeException

catch (MalformedURLException ex) {
    throw new RuntimeException("Failed constructing URL", ex);
}

理想情况下,您真的想编辑方法的throws子句,以便它可以容纳任何可能源于覆盖的异常;但是因为在你的情况下这是不可能的(根据你的条件),上面对我来说似乎是最合理的。

相关的最佳做法是避免在包装之前记录异常。从设计的角度来看,没有必要这样做 - 调用者已经可以访问原始的Exception对象(通过抛出的getCause()的{​​{1}}方法),所以调用者应该决定是否记录它。