如何从 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
对象(通过抛出的 RuntimeException
的 getCause()
方法)所以调用者应该决定是否记录与否。
终止执行覆盖方法的最佳做法是什么? 下面是解释上下文的示例代码:
@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
对象(通过抛出的 RuntimeException
的 getCause()
方法)所以调用者应该决定是否记录与否。