Java try catch блокирует

Вот простой вопрос:

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

void myfunction() {
    try {
        instruction1();
    }
    catch (ExceptionType1 e) {
        // some code
    }
    try {
        instruction2();
    }
    catch (ExceptionType2 e) {
        // some code
    }
    try {
        instruction3();
    }
    catch (ExceptionType3 e) {
        // some code
    }
    try {
        instruction4();
    }
    catch (ExceptionType4 e) {
        // some code
    }

    // etc
}

Я знаю, что это ужасно, но я хочу знать, снижает ли производительность.

Ответ 1

Попробуйте что-нибудь вроде этого: (Я знаю, что это не отвечает на ваш вопрос, но он чище)

void myfunction() {
try {
    instruction1();
    instruction2();
    instruction3();
    instruction4();
}
catch (ExceptionType1 e) {
    // some code
}
catch (ExceptionType2 e) {
    // some code
}
catch (ExceptionType3 e) {
    // some code
}
catch (ExceptionType4 e) {
    // some code
}

// etc
}

Ответ 2

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

Помните золотое правило: читаемый код - это скорее быстрый код. Сначала выведите считываемый код и измените его, если он окажется слишком медленным.

Группируйте блоки try-catch в логические фрагменты исходного кода (например, один для открытия потока и чтения данных из него, один для всей обработки, выполненной впоследствии), и разработчики вашего обслуживания будут благодарны вам за это.

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

Ответ 3

Нет, это, вероятно, не снижает производительность (но, как всегда, вам придется ее протестировать). При компиляции в байт-код обработчики исключений Java меняются на таблицу диапазонов смещения байт-кода и связанных адресов обработчиков. Обработчики catch обычно скомпилированы за пределами основной линии кода, поэтому не влияют на "нормальное" выполнение без исключения.

Более подробную информацию можно найти в Спецификации виртуальной машины Java, раздел 7.12 "Исключение и обработка исключений" . В этом разделе также приведены примеры того, как различные кодовые конструкции могут быть скомпилированы в байт-код.

Ответ 4

Использование чрезмерных количеств try-catch может стать дорогостоящим с точки зрения производительности при выдаче исключений. Вам было бы лучше, если бы не было так много проверенных исключений или все ваши ExceptionTypes распространяли общий базовый класс Exception. Таким образом, у вас может быть одна попытка catch, которая намного легче читать и имеет лучшую производительность.

Ответ 5

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