Блок захвата Java, пойманное исключение не является окончательным
Я проверяю новые функции Java SE7, и в настоящее время я нахожусь в этой точке:
http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html
что касается функции "поймать несколько", когда я наткнулся на это утверждение:
Примечание. Если блок catch обрабатывает несколько типов исключений, параметр catch неявно является окончательным. В этом примере параметр catch ex является окончательным, и поэтому вы не можете присвоить ему значения в блоке catch.
Я никогда не замечал, что перехваченное исключение не является окончательным в классическом случае обработки перехваченных исключений.
Мне просто интересно, почему это хорошо в первую очередь? Разве не было бы неправильным по существу ИЗМЕНИТЬ пойманное исключение, прежде чем я угадаю, что оно будет переброшено или, возможно, будет записано его сообщение? Разве не должно быть механизмом создания создавать исключение, чтобы оно точно представляло, что должно?
Я никогда не видел, чтобы исключение было изменено в блоке catch. Может, кто-то укажет на его преимущества?
Спасибо!
4 ответа
Это почти так же, как аргументы метода:
Вы обычно не изменяете их, и многие люди соглашаются, что к ним следует относиться как к final
(стоит ли на самом деле писать final
перед ними идет какой-то спор).
Но так как нет технических требований, которые говорят, что это должно быть final
, язык дает вам возможность выбрать.
Лично я не знаю веских причин для изменения ссылки на исключение блока catch.
Я не могу придумать убедительного варианта использования для модификации исключения в классическом catch
пункт. Однако это не значит, что это должно быть запрещено. Особенно с учетом того, что вы можете изменить параметр переменной. Если вас это беспокоит, у вас есть возможность объявить переменную исключения как final
,
С другой стороны, разрешение модификации в ловушке с несколькими исключениями может привести к действительно странному и запутанному коду, например так:
catch (IOException | NullPointerException ex) {
...
ex = new IllegalArgumentException(...);
}
Я полагаю, что это имели в виду дизайнеры, когда добавляли ограничение в этом случае.
Но в любом случае, именно так определяется язык Java и с чем нам приходится жить. В обсуждении явных несоответствий нет особого смысла... если только вы не собираетесь разрабатывать и внедрять новый язык.
Идея обработки ошибок на основе исключений состоит в том, что каждая ошибка должна быть исправлена, если это вообще возможно, на соответствующем уровне абстракции. Такое исправление ошибок может потребовать информацию, которая недоступна непосредственно там, где действительно обрабатывается исключение. По этой причине может быть удобно перехватить исключение, дополнить его соответствующей информацией и повторно выбросить или, возможно, установить в качестве причины нового объекта исключения более подходящего класса.
Причина, по которой я могу придти к окончательному исполнению, связана с производительностью. Как только начинается оценка вылова, наличие окончательного неизменного значения в механике оценки обеспечивает более быструю оценку всех уловов. Поскольку try-catch широко используется в любом Java-коде, предпочтительнее проект с наивысшей производительностью.
Исходя из вышесказанного, это означает улучшение производительности, которое влияет на большинство программ.