Обработка ошибок Java - PullRequest
2 голосов
/ 03 мая 2011

Как я уверен, вы все знаете, что Java применяет очень строгий шаблон для обработки ошибок, при котором любое исключение должно обрабатываться либо через блок try catch, либо путем объявления метода с ключевым словом throws.(Могу добавить, что мне действительно нравится, как это делается)

Сказав это;С чем я борюсь, так это с выбором правильного подхода к обработке ошибок различными методами.Исходя из опыта C # / VB.NET, ранее я всегда строго придерживался обработки ошибок (во всех случаях, кроме самых специфических обстоятельств) в самой нижней части стека, однако я не уверен, что это лучший подход в Java.

Может ли кто-нибудь предоставить информацию по этому поводу?Что считается лучшей практикой?Как можно решить, следует ли на самом деле создать исключение вне метода или обработать его внутренне (очевидно, что некоторые случаи очевидны, но не так)?

Ответы [ 3 ]

10 голосов
/ 03 мая 2011

По каждому методу я спрашиваю себя:

  1. Достаточно ли у этого метода информации для правильной обработки этого исключения? Если да, справляйся. В противном случае ...
  2. Достаточно ли у вызывающей стороны информации для правильной обработки этого исключения? Если да, отбросить. В противном случае ...
  3. Нужно ли вызывающей стороне специально обрабатывать сбои в операциях с этим компонентом? Если да, повторно использовать как вложенный в подкласс исключения компонента. В противном случае ...
  4. Ретроу как непроверенный.
1 голос
/ 03 мая 2011

Вы хотите обработать исключение там, где оно возникает, если и только если вы действительно можете что-то сделать, чтобы это исправить.

Вот типичный пример:

int foo(String userInput) {
    int i = Integer.parseInt(userInput);
    return i * 4;
}

Это приведет ккроме строковых входов не чисел.Но вы ничего не можете с этим поделать, поэтому вы позволяете ему распространяться.

Вот еще один пример

class Communicator {

    private InputStream in;
    private OutputStream out;

    public Communicator(Socket socket) throws IOException {
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());
    }

}

Если сокет вызывает IOException, вы можете ожидать восстановления и созданиячто коммуникатор еще работает?Думаю, нет.Отпусти его, дай ему распространиться и найди кого-нибудь, кто сможет с этим справиться.

Кроме того, ты должен знать, что тебе не нужно catch или объявить throws для всех исключения.Если это RuntimeException, вам не нужно.Для части Большинство эти исключения обычно означают ошибки (NullPointerException, кто-нибудь?) Или неправильный ввод данных пользователем (NumberFormatException.)

1 голос
/ 03 мая 2011

Это банальный ответ, но поймайте исключение, когда вы действительно можете что-то с ним сделать для восстановления. Различные исключения означают, что вы можете обрабатывать исключения на разных уровнях архитектуры.

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