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
Как вы можете видеть из этого ответа, производительность достигает минимального значения, если не возникает ошибка.