首先,让我指出您的代码中的一个错误。您的方法声明它抛出异常,但它没有。它抛出 SvcException。所以这就是“投掷”条款应该说的。 (无论如何,你都不应该说“抛出异常”。你应该明确说明它抛出了什么样的异常。)答案的其余部分取决于你的模糊描述“进行网络调用”是否抛出异常。
如果没有,您的方法应该如下所示:
void connectOverNetwork() throws SvcException {
final JSONObject response = makeNetworkCall();
if (!response.getBoolean(SUCCESS)) {
LOG.error("--- foo message ---");
throw new SvcException("message replied with error");
}
}
但这是不现实的。很有可能,您的“进行网络调用”代码会抛出类似 IOException 的东西。在这种情况下,您的代码应如下所示:
void connectOverNetwork() throws SvcException {
try {
final JSONObject response = makeNetworkCall(); // throws IOException
if (!response.getBoolean(SUCCESS)) {
LOG.error("--- foo message ---");
throw new SvcException("message replied with error");
}
} catch (final IOException e) {
LOG.error("--- foo message ---");
throw new SvcException("failed to connect", e); // wrap e inside SvcException
}
}
请注意,我将捕获的 IOException 包装在 SvcException 中。如果您的 SvcException 没有这样做,请重写它以便它可以,或者在抛出它之前调用它的 initCause() 方法。在重新抛出不同的异常时,您应该始终包含原始异常。
另外请注意,我不会费心抛出、捕获并重新抛出 IOException。当我检测到失败时。我只是抛出我需要抛出的异常。这意味着我需要在两个不同的地方记录 foo 消息。对于大多数事情,应该避免重复一行代码,但对于日志记录,这很好。
但是这段代码有点乱。我会通过将成功测试与可能的 IOException 分开来清理它。所以我会这样写:
void connectOverNetwork() throws SvcException {
JSONObject response; // no need to initialize this.
try {
response = makeNetworkCall(); // throws IOException
} catch (final IOException e) {
LOG.error("--- foo message ---");
throw new SvcException("failed to connect", e); // wrap e inside SvcException
}
if (!response.getBoolean(SUCCESS)) {
LOG.error("--- foo message ---");
throw new SvcException("message replied with error");
}
}
请注意,响应是在 try 循环之前声明的。它没有被初始化,因为它不可能在没有值的情况下到达!response.getBoolean(SUCCESS) 测试。如果 makeNetworkCall() 抛出异常,它甚至不会到达该行。