如何从 Java 中的重写方法传播异常

How to propagate exception from an overridden method in Java

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

@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 子句添加到方法签名中,因为它已被覆盖并且基础 class 不允许它。

2) 由于该方法必须return 一个String,所以我必须在catch 块之后指定return 语句。(如果发生异常我return 怎么办?)

3) 在 catch 块中使用 System.exit - 正如该论坛上的其他一些帖子所指出的,当您希望代码可重用时,这可能不是一个好的做法。

这种情况下的最佳做法是用 RuntimeException:

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

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

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