Использовать существующий блок try / catch или дублирующий блок catch без исключения - PullRequest
0 голосов
/ 26 сентября 2019

Рассмотрим следующий блок try / catch:

try {
    throwCheckedException();
} catch (IOException e) {
    doStuffWithException(e);
}

В приведенном выше блоке throwCheckedException имеет шанс вызвать проверенное исключение, поэтому мне нужно предложение catch, которое вызывает doStuffWithException.Однако, скажем, я хочу добавить в этот блок дополнительный оператор:

if (!someBoolean) {
    throw new IOException("someBoolean must be true, got false.");
}

Должен ли я использовать блок catch и просто вставить приведенный выше код в блок try, или было бы лучше скопировать то, что вблок catch, например, что показано ниже?

try {
    throwCheckedException();
    if (!someBoolean) {
        doStuffWithException(
            new IOException("someBoolean must be true, got false.")
        );
    }
} catch (IOException e) {
    doStuffWithException(e);
}

1 Ответ

2 голосов
/ 26 сентября 2019

Исключение составляет дорогое операция.Итак, если вы рассматриваете две альтернативы - бросание и не бросание, то не бросание является предпочтительным способом.

Однако, используя исключение в качестве входного параметра для doStuffWithException в try-block, похоже на небольшой код.Итак, я бы предложил реорганизовать логику обработки исключений, чтобы она не зависела от исключения в качестве входного параметра.

Если вы обрабатываете исключительную ситуацию в зависимости от исключительных данных - извлеките эти данные и перейдите к методу handle.По сути, не используйте исключения в качестве DTO или POJO (поскольку исключения не предназначены для этой цели).

Подводя итог, я предлагаю иметь что-то вроде следующих фрагментов:

try {
    throwCheckedException();
    if (!someBoolean) {
        Data data = createData();
        handle(data);
    }
} catch (IOException e) {
    Data data = createDataFromMessage(e.getMessage());
    handle(data);
}

В качестве альтернативы, чтобы уменьшить вложенность внутри try-block:

try {
    throwCheckedException();
} catch (IOException e) {
    Data data = createDataFromMessage(e.getMessage());
    handle(data);
}

if (!someBoolean) {
    Data data = createData();
    handle(data);
}

...