Лучшая практика для обработки ошибок HTTP-вызова - PullRequest
4 голосов
/ 26 апреля 2011

Я отправил этот вопрос в группы разработчиков Android, но я хотел бы опубликовать его здесь для других людей, которые могут столкнуться с проблемой дизайна, как я:

Я искал идиому или парадигму о том, как справитьсяОшибки HTTP.

По существу,

У меня есть AsyncTask, который выполняется в фоновом потоке, который вызывает мой статический метод executeRequest ().

Это все сделанов части doInBackground ().Существует два типа исключений, которые генерируются executeRequest ().IOException для всех ошибок связи и исключение ServerErrorResponse, которое является моим собственным исключением.Это может произойти, если, например, клиент отправил что-то плохое на сервер, весь HTTP работал, но сервер пожаловался (возможно, я передал недопустимый параметр или идентификатор).

Итак, что я сделал, это обернул результатв "объекте результата" моего собственного.

В onPostExecute () я проверяю, не был ли результат ошибочным, а затем пытаюсь обработать его в потоке пользовательского интерфейса.Однако теперь я должен начать делать

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.Есть ли способ обойти это или дизайн, которому я мог бы следовать, чтобы избежать этого?Я хочу, чтобы исключения обрабатывались в потоке пользовательского интерфейса на случай, если я покажу пользователю диалоговое окно или что-то в этом роде.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011
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?)
  }
}
2 голосов
/ 26 апреля 2011

Это только один вариант из нескольких:

Создайте интерфейс, например

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...