处理HTTP错误调用的最佳实践

时间:2011-04-26 16:42:50

标签: java android multithreading http exception

我已将此问题发布给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线程中处理异常,以防我向用户显示对话框或其他内容。

有什么想法吗?

2 个答案:

答案 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);
  }

}