对于以下情况,是否有规范的最佳方法?
我有一个代码块可以生成许多不同的异常,每个异常都是通过隐藏对话框,显示错误消息和运行onDisconnect()
方法来处理的。问题在于,对于每个异常,错误消息都需要不同。我认为,有两种选择。第一个是捕获Exception
,然后使用instanceof
处理catch块内的各种异常,如下所示:
} catch (Exception e) {
dialog.dismiss();
String errorMessage = getString(R.string.default_error);
if (e instanceof ArrayIndexOutOfBoundsException)
errorMessage = getString(R.string.bad_host);
else if (e instanceof UnknownHostException)
errorMessage = getString(R.string.unknown_host);
else if (e instanceof NumberFormatException)
errorMessage = getString(R.string.bad_port);
else if (e instanceof IOException)
errorMessage = getString(R.string.no_connection);
showError(errorMessage);
onDisconnect();
}
另一种选择是分别捕捉所有这些,如下:
} catch (ArrayIndexOutOfBoundsException e) {
dialog.dismiss();
showError(getString(R.string.bad_host));
onDisconnect();
} catch (UnknownHostException e)
dialog.dismiss();
showError(getString(R.string.unknown_host));
onDisconnect();
} // ...etc.
有没有首选方法可以做到这一点?我选择了第一个案例(至少目前为止),因为它最大限度地减少了重复的代码,但我也听说instanceof
和catch (Exception)
是撒旦的作品。
答案 0 :(得分:6)
我的偏好是有一个像这样的单独方法:
void handleException(String msg) {
dialog.dismiss();
showError(getString(msg));
onDisconnect();
}
然后在你的代码中抛出异常就像这样:
} catch (ArrayIndexOutOfBoundsException e) {
handleException(getString(R.string.bad_host));
} catch (UnknownHostException e)
handleException(getString(R.string.unknown_host));
} // ...etc.
答案 1 :(得分:3)
你想分开捕捉它们。如果你捕获了通用的Exception,你可能最终会捕获你不期望的异常(例如,可以从堆栈中的其他位置向上推送),并且你阻止它们传播到它们实际意图的任何地方被处理。
(稍后编辑):您可能还希望使用finally来避免一些代码重复问题。
答案 2 :(得分:2)
创建一个(private void)方法来处理错误。您可能需要在某些参数中传递有关正在发生的事情,但行为将保持一致。当您对方法进行更改时,它会更改所有使用它的位置,因此您可以减少样板代码。
try {
// stuff
} catch(OneException) {
handleSimilarExceptions();
} catch(TwoException) {
handleSimilarExceptions();
} catch(DifferentException) {
log.write("Something wierd happened, handling it");
somethingDifferent();
}
答案 3 :(得分:1)
如果你像改进的第二版那样做了什么:
catch (ArrayIndexOutOfBoundsException e) {
handleException(R.string.bad_host);
} catch (UnknownHostException e)
handleException(R.string.unknown_host);
} // ...etc.
void handleException(String s) {
dialog.dismiss();
showError(getString(s));
onDisconnect();
}
我同意,像这样使用的例子是撒旦的作品......