Java попробуй поймать блоки - PullRequest
5 голосов
/ 01 марта 2011

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

Что вы думаете о коде, который использует 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
}

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

Ответы [ 5 ]

9 голосов
/ 01 марта 2011

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

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
}
6 голосов
/ 01 марта 2011

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

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

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

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

5 голосов
/ 01 марта 2011

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

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

2 голосов
/ 01 марта 2011

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

1 голос
/ 01 марта 2011

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

...