我已将此问题发布给Android开发者小组,但我想在此处发布给其他可能面临像我这样的设计问题的人:
我一直在寻找关于如何处理HTTP错误的习惯用法或范例。
基本上,
我有一个在后台线程中运行的AsyncTask,它调用一个名为executeRequest()的静态方法。
这一切都在doInBackground()部分完成。 executeRequest()抛出两种类型的异常。所有通信错误的IOException和ServerErrorResponse异常,这是我自己的异常。如果例如客户端向服务器发送了一些不好的内容,整个HTTP工作但服务器抱怨(可能是我传递了无效的参数或id),就会发生这种情况。
所以,我所做的是将结果包装在我自己的“结果对象”中。
在onPostExecute()中,我检查结果是否失败,然后我尝试在UI线程中处理它。但是,我现在必须开始做
Exception e = result.getException();
if (e != null) {
if (e instanceof IOException) { //network error
//handle network error here
} else if (e instanceof ServerErrorResponseException) {
//handle server error response here
}
正如您所看到的,这变得很烦人,对于每个新的异常,我都要使用instanceof来检查它。有没有办法绕过它或我可以遵循的设计来避免这种情况?我希望在UI线程中处理异常,以防我向用户显示对话框或其他内容。
有什么想法吗?
答案 0 :(得分:3)
Exception e = result.getException();
if (e != null) {
try {
throw e;
} catch (IOException ex) {
//handle network error here
} catch (ServerErrorResponseException ex) {
//handle server error response here
} catch (Exception ex) {
//handle RuntimeException and others here
//(You weren't just going to ignore them, were you?)
}
}
答案 1 :(得分:2)
这只是一个选项中的一个:
创建一个类似
的界面public interface ResultReceiver {
public void onSuccess(YourClass object);
public void onError(Exception err);
//alternatives to the former:
public void onNetworkError(IOException err); //maybe the parameter is optional?
public void onServerProblem(ServerErrorResponseException err);
}
现在,在您的onPostExecute
中执行类似
result.handleWith(this); //I'm assuming your activity implements ``ResultReceiver`` interface
如果您愿意,可以在活动之外创建结果处理程序(此选项更好,以避免跨活动的代码重复)
最后,handleWith
实施:
public void handleWith(ResultReceiver handler){
Exception e = result.getException();
if (e != null) {
if (e instanceof IOException) { //network error
handler.onNetworkError(e);
} else if (e instanceof ServerErrorResponseException) {
handler.onServerProblem(e);
} else {
handler.onSuccess(this);
}
}