Есть ли какая-то причина бросить "Исключение" и немедленно поймать его?

Этот код из нашего проекта, производственный код:

if (changedToNull) {
    try {
        throw new Exception();
    } catch (Exception e) {
        log.debug("changedToNull", e);
    }
}

Разработчик больше не работает с нами.

Зачем кому-то бросать Exception и улавливать напрямую и записывать его?

Ответ 1

Основная цель состоит в том, чтобы получить стек вызовов, когда вы входите в этот блок if для цели отладки, но его можно переписать следующим образом:

if (changedToNull) {
    log.debug("changedToNull", new Exception("changedToNull is true"));
}

Скажем, что changedToNull никогда не должно быть true, и вы хотите, чтобы стек вызовов понял, как это произошло, вы можете продолжить этот путь.


Создание стека вызовов довольно дорого, поэтому вы должны убедиться, что уровень debug включен, также проверив значение isDebugEnabled() (при условии, что вы используете log4j) следующим образом:

if (changedToNull && log.isDebugEnabled()) {
    ...
}

Ответ 2

Это выглядит бесполезным для меня кодом. Некоторые люди упомянули, что он даст вам трассировку стека, но поскольку он просто создает новое исключение, трассировка стека вряд ли даст много полезной информации (если только в редких случаях отладки).

Я бы перестроил код, чтобы он выглядел так и избегал даже исключения:

if (changedToNull) {
    log.debug("changedToNull");
}

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

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