Лучшая практика для обработки нескольких исключений подобными способами в Java - PullRequest
3 голосов
/ 02 апреля 2011

Есть ли канонический лучший способ сделать это для следующей ситуации?

У меня есть блок кода, который может генерировать множество различных исключений, каждое из которых обрабатывается путем скрытия диалога, отображения сообщения об ошибке и запуска метода onDisconnect().Подвох в том, что для каждого исключения сообщение об ошибке должно быть разным.На мой взгляд, есть два варианта.Первый - перехватить Exception, а затем обработать различные исключения внутри блока catch, используя instanceof, например:

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

Другой вариант - перехватить все из них по отдельности, например:1009 *

    } 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) - дела сатаны.

Ответы [ 4 ]

6 голосов
/ 02 апреля 2011

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

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.
3 голосов
/ 02 апреля 2011

Вы хотите поймать их отдельно.Если вы поймаете универсальное Исключение, вы можете в конечном итоге поймать Исключения, которые вы не ожидаете (например, они могут быть перенесены откуда-то еще в стеке), и вы не дадите им распространяться туда, куда они фактически предназначалисьбыть обработанным.

(позднее редактирование): вы также можете захотеть использовать finally , чтобы избежать некоторых проблем с повторением кода.

2 голосов
/ 02 апреля 2011

сделать (private void) метод для обработки ошибки. Вам может потребоваться передать это в некоторых параметрах о том, что происходит, но поведение будет последовательным. Когда вы вносите изменения в метод, он меняет все места, где он используется, так что вы можете уменьшить свой стандартный код.

try {
   // stuff

} catch(OneException) {
    handleSimilarExceptions();
} catch(TwoException) {
    handleSimilarExceptions();
} catch(DifferentException) {
    log.write("Something wierd happened, handling it");
    somethingDifferent();
}
1 голос
/ 02 апреля 2011

Что делать, если вы делаете что-то вроде модифицированной второй версии:

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

И я согласен, такой пример использования - это работа сатаны ...

...