Подтвердить что ты не робот

Как вы регистрируете непроверенные исключения?

Джошуа Блох в своей Эффективной Java пишет:

"Используйте тег Javadoc @throws для документирования каждого неконтролируемого исключения, которое метод может бросать, но не используйте ключевое слово throw для включения unchecked исключения в объявлении метода. "

Ну, это звучит разумно, но как узнать, какое неконтролируемое исключение может вызвать мой метод?

Подумайте о следующем классе:

public class FooClass {

    private MyClass[] myClass;

    /**
     * Creates new FooClass
     */
    public FooClass() { 
        // code omitted
        // do something with myClass
    }

    /**
     * Performs foo operation.<br />
     * Whatever is calculated.
     * @param index Index of a desired element
     * @throws HorribleException When something horrible happens during computation
     */
    public void foo(int index) {
        try {
            myClass[index].doComputation();
        } catch (MyComputationException e) {
            System.out.println("Something horrible happened during computation");
            throw new HorribleException(e);
        }
    }
}

Теперь я документировал HorribleException, но совершенно очевидно, что метод foo также может вызывать неконтролируемый java.lang.ArrayIndexOutOfBoundsException. Чем сложнее код, тем сложнее думать обо всех непроверенных исключениях, которые может бросить метод. Моя IDE не очень помогает мне и никому не помогает. Поскольку я не знаю никаких инструментов для этого...

Как вы справляетесь с такой ситуацией?

4b9b3361

Ответ 1

Только документируйте те, которые вы явно бросаете сами или проходите с другого метода. Остаток должен учитываться как ошибки, которые должны быть исправлены с помощью хорошего модульного тестирования и написания надежного кода.

В этом конкретном случае я бы зарегистрировал ArrayIndexOutOfBoundsException как ошибку в вашем коде, и я исправлю код соответствующим образом, чтобы он никогда не выдавал его. То есть добавьте проверку, если индекс массива находится в диапазоне и обрабатывает соответственно, либо бросая исключение, которое вы документируете, либо принимаете альтернативный путь.

Ответ 2

Чем сложнее код, тем сложнее подумать обо всех непроверенных исключениях, которые может бросить метод.

Если вы видите проблему, я вижу очень вескую причину, чтобы ваш код был простым: -)

В вашем примере я предлагаю документировать ArrayIndexOutOfBoundsException. Просто потому, что у кого-то может быть что-то, когда вы даете вам плохой параметр, и где-то он должен быть написан: "Если вы указали неверный индекс массива, вы получите ArrayIndexOutOfBoundsException. Например, документы метода String#charAt() он может выбросить IndexOutOfBoundException, если индекс недействителен.

В общем, вы не должны документировать все исключения, которые могут возникнуть. Вы не можете предсказать их все, и вы, скорее всего, его забудете. Итак, документируйте очевидные, те, которые вы, хотя. Постарайтесь перечислять большинство исключений, насколько это возможно, но не тратьте на это много времени. В конце концов, если вы забудете тот документ, который должен быть задокументирован, вы можете улучшить свою документацию позже.

Ответ 3

Документируйте только то, что вы бросаете.

В этом случае я бы пошел на проверку индексов и выбросил свое исключение: throw IllegalArgumentException("Index must be smaller than " +myClass.length + ", but is: " + index) а затем документируйте исключение IllegalArgumentException в JavaDoc.

Ответ 4

У нас есть письменное расширение для проверки, которое выполняется на нашем тестовом сервере. В вашем образце он будет проверять, зарегистрировано ли HorribleException.

ArrayIndexOutOfBoundsException обнаружит проверку кода. В вашем примере кода наши цели должны были исключить InvalidArgumentException вместо ArrayIndexOutOfBoundsException. Документацию по нему можно найти на тестовом сервере.

Ошибка ArrayIndexOutOfBoundsException может быть предупреждением в FindBugs. Но я не уверен.

Ответ 5

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

Однако есть три возможных решения:

  • Не документируйте метод.
  • Подумайте минутку о том, что делает ваш код, и узнайте, какие наиболее распространенные исключения могут быть исключены. Добавьте их в Java-документ. И если вы встретите новый, узнайте, в чем проблема, и добавьте его как возможное исключение.
  • Не заботьтесь о возможных исключениях и документируйте только те исключения вы в тело метода (например: if (obj == null) { throw new NullPointerException(); }).