На прошлой неделе писал о том, как разработчики усложняют код Java. Возвращаюсь в эту тему, теперь поговорим немного об очень полезная функция языка, что, я считаю, это очень неправильно поняли: exceptions.
Исторический обзор
Считаю, что освоить язык программирования, один из первых шагов что мы должны принять это, стремиться понять, что узнал, какие принципы руководили его создания. Подход, исторический падает очень хорошо в данный момент, поэтому я рекомендую вам прочитать главу об исключениях, например, составлен в спецификации Java 1.0, доступный в этом ссылка (заметьте, ирония).
Чтение этой спецификации, является интересно, особенно когда мы видим в явной форме основных целей дизайнеров в создании языка на тот момент: обеспечить переносимость и надежность . Признавая исключений, что меня действительно интересует, – это второй принцип. Как эта надежность достигается?
Перед немного семантика: exception, как само название уже говорит нам, что указывает ненормальное состояние, которое возникает в процессе реализации наших программ.
Жизнь без исключений
Многие языки программирования, просто уточняя реализации программного обеспечения (думаю, в C или Pascal), когда что-то происходит, и не существует какой-то способ обработки ошибки узором, другой альтернативой является просто вернуть код ошибки, который может быть легко проигнорировано, программист (думаю, в функции read C возвращается значение -1, например).
Давайте на пример, с помощью “псевдо-C”. Язык распри вызов функции read (описанное выше), который считывает байт из источника данных и сохраняет его в буфере. Она возвращает значение -1, если что-то не так происходит, и 0, если мы пришли в конец файла и положительное значение, в о том, сколько байтов было прочитано. См. код ниже:
char buffer[128]; read(arquivo, buffer, 128); printf("Serei impresso?"); // operações importantes seriam executadas na sequência
Это очень распространенный: разработчик ожидает, что файл всегда существует, таким образом, она “уверена”, что выход “я Буду монтажом?” всегда будет отображаться в вашем терминале. Но это не всегда так: и если файл мнимой жизни? Наш наивный программист будет решать проблемы, так как выполнение программы закончится в какой-то момент после этой печати.
Может быть, наш программист мог написать выше код по-другому, как показано в примере ниже:
char buffer[128]; int resultadoLeitura = read(arquivo, buffer, 128); if (resultadoLeitura < 0) { // tento corrigir a situação aqui }
Является альтернативой, код стал более надежным, но его чтение не становится ясно, что на самом деле произошло для условий ошибки. Файл был удален? Было бы разрешение проблемы? Еще хуже: код, что и побудило на написание программы, основной поток (в оптимальных условиях температуры и давления) в настоящее время находится объединены в код обработки ошибок.
Java пришел с решением более интересным. Видно, что наши занятия-это интерфейс, почему бы не предупредить своих клиентов о том, что может пойти не так, и, еще лучше: заставить их обрабатывать эти ситуации (проблема находится в этой “силы”их)?
Пенсандо комо Гослинг, Джой э Стил
Ясность записи
Более удивительно, что может показаться несколько важных текущих языка, в то время одной из целей было иметь код, менее подробный. Идеальным является то, что программист мог видеть, основной поток вашей программы простой, и обработка ошибок в отдельности, как в следующем примере:
String conteudoArquivo(File arquivo) { try { // meu fluxo principal entra aqui } catch (FileNotFoundException;ex) { // o que eu faço se o arquivo não existir? } catch (EOFException ex) { // e se o arquivo chegar ao fim antes do imaginado? } catch (IOException ex) { // e se for algum outro erro de I/O que não previ e // não seja como os que mostrei antes? } }
Интересно, как теперь вы знаете, что может быть, не так, и может различать ясно, как относиться к каждой из этих ситуаций. Еще лучше: то, что действительно важно, основной поток, четко изолированы.
Exception-это, в действительности, отклонение потока. Может быть, вы обрабатывать ошибки типа файл не найден и IOException таким же образом. В этом случае, в качестве первого исключений является подклассом второго, просто поместите один блок catch для этого.
Исключения, как контракт
Больше, чем это, я считаю, что многие разработчики просто не знали, как интерпретировать код, который находят: представьте себе, что объявление метода, как показано ниже:
void processeArquivos(File[] arquivos) throws FileNotFoundException
Метод говорит мне:
Метод, договора , и исключение, проверки, что же будет достигнута. Если не так, то поток должен быть изменен таким образом, чтобы o есть и ответственность, чтобы решить эту проблему, переложены на другой объект (может быть, клиент клиента).
Что это: договор действительным является тот, так и значение. Легко заметить, когда тот, кто пишет код не имеет большого идея о том, что вы делаете. Обратите внимание, в объявлении ниже:
void processeArquivos(File[] arquivos) throws Throwable
То, что этот метод мне говорит?
У нас есть средства контракт здесь: мы только знаем, что мы должны передавать файлы, чтобы этот метод. Не знаю, если все должны на самом деле быть доступны только отправки.
Исключения проверяется и не проверяется. Ты что?
Например, как это “проверенные исключения” и “непроверенные исключения”? То, что отличает одну от другой? Интерпретация быстрый будет:
Что не реагирует почти ничего, кроме разоблачения иерархии классов неполной. Ответ самый простой: есть ошибки, которые поддаются лечению, а другие не так много. Ошибки лечению являются те, которые определяют контракт, и клиенты могут, по крайней мере, попытаться решить их, когда они происходят.
Например: файл недоступен ошибка поддается лечению. Если возникла ошибка типа файл не найден, то, возможно, удастся создать новый файл, а затем вызвать эту функцию или процедуру еще раз.
С другой стороны, если есть авария, но моя операционная система или мой файловой системы исчезнуть, не есть много, что я могу сделать. Это ошибка времени выполнения (runtime). И количество проблем такого рода, которые могут возникнуть, практически бесконечен: HD может загореться, или HD может быть удален, или ваша операционная система может исчезнуть, или сеть может стать недоступной, или кто-то может выключить сервер, или….
Почему исключения типа во время Выполнения, которые не являются “checked”? Я хочу попросить Гослинг, Радость и Стил силы. Посмотрите, что сказано в разделе 11.2.2 спецификации :
Интересно также посмотреть, что авторы говорят в спецификации к нам, говорят, что еще одна категория ошибок (java.lang. Error) не будут проверяться (11.2.1):
Таким образом, вместо того, чтобы заставить разработчиков лечения каждого эти проблемы, почему не заставляет его заниматься только тем, что договора ? Это один из главных мотиваторов: тебя заставить писать меньше кода и, кто знает, написать код, лучшее качество.
Это не означает, что вы должны написать код, как следовать:
try { // aqui está meu fluxo principal } catch (Throwable t) { // aqui lidarei com todos os problemas possíveis e impossíveis // dos multiversos }
Когда мы пишем что-то вроде “catch (Throwable)” мы с одним из следующих идей в голове:
- Буду игнорировать любой ошибки, которые могут возникнуть. (me faz lembrar do ” при ошибке возобновить следующий ” do VB)
- Все ошибки одинаковы, поэтому расскажу все так же.
Если один из руководящие принципы создания Java была надежность, и мы используем Java (пропустите свой любимый язык на мгновение), написать код такого типа является искажать язык и вводить в заблуждение.
Это: checked exceptions позволяют компилятор проверить, если вы имеете дело с ситуациями, аномальных, определенные в договоре их интерфейсов.
Как хорошо исключения?
Основным стимулом для написания этого поста те отзывы, которые я слышу о том, как язык Java имеет дело с исключениями. Интересно, как много людей забывают о том, что ресурс был включен в язык, чтобы облегчить жизнь программиста, а не осложнять ее.
Интересно, что подавляющее большинство отзывов, которые я вижу движет неправильного использования или понимания ресурса. Поэтому, ниже приведены некоторые советы:
- Воспринимайте исключения, как определение договора четко определены: они определяют помещения, или то, что не должно произойти на, что код может быть выполнен успешно.
- Воспользуйтесь точности: “catch (Throwable)” не дает вам возможность справиться с различными ситуациями, или нарушения условий договора, которые могут возникнуть во время работы системы, вам будет только создание блока catch, который в будущем может стать настоящий монстр.
- Entenda a differença entre проверенные и непроверенные исключения.
- Один declaraçao метода, который содержит instruçao броски следуют 293847 типов исключений и что-то вроде “бросает Throwable,” одно и то же.
- Если checked exceptions являются для вас проблемой, рассмотрите языки, такие как Groovy, что делает обрабатывать исключения задачи дополнительно
Я надеюсь, что этот текст быть уточнены некоторые моменты, об одном из самых интересных аспектов языка Java.
Оригинал: “https://dev.to/loboweissmann/excecoes-do-java-sao-uteis-talvez-voce-e-que-nao-saiba-usa-las-669”