Ревью 4 Ката. Ревью 4. Исключение это ошибка, возникающая во время выполнения программы. Используя подсистему обработки исключений Java, можно контролировать реакцию программы
Скачать 60.08 Kb.
|
Что такое исключения? Для чего они нужны? Исключение – это ошибка, возникающая во время выполнения программы. Используя подсистему обработки исключений Java, можно контролировать реакцию программы на появление ошибок в ходе ее выполнения. Расскажи про иерархию исключений. Висключения представлены отдельными классами. Все классы исключений являются потомками класса Throwable. Так, если в программе возникнет исключительная ситуация, будет сгенерирован объект класса, соответствующего определенному типу исключения. У класса Throwable есть два подкласса: Exception и Error. Исключения типа Error относятся к ошибкам, возникающим в виртуальной машине Java, а не в программе. Контролировать такие исключения невозможно, поэтому реакция на них в прикладной программе, как правило, не предусматривается. Ошибки, связанные с выполнением действий в программе, представлены отдельными подклассами, производными от класса Exception (пр. деления на ноль, выхода за границы массива и обращения к файлам). Подобные ошибки следует обрабатывать в самой программе. Важным подклассом, производным от Exception, является класс RuntimeException, который служит для представления различных видов ошибок, часто встречающихся при выполнении программ. В чём разница между проверяемыми исключениями и непроверяемыми? В чём разница с точки зрения синтаксиса и идеологическая при использовании? Проверяемые исключения – это исключения, на которые разработчик обязан отреагировать, т.е написать обработчики, и наличие этих обработчиков будет проверено на этапе компиляции. Код не будет скомпилирован, если какое-то проверяемое исключение не обработано, компилятор этого не допустит. (Throwable, Exception) Непроверяемые исключения – это исключения времени выполнения. Компилятор не будет от вас требовать обработки непроверяемых исключений. (RuntimeException, Error) Checked исключения отличаются от Unchecked исключения в Java, тем что: Наличие\обработка Checked исключения проверяются на этапе компиляции. Наличие\обработка Unchecked исключения происходит на этапе выполнения. Checked исключения, это те, которые должны обрабатываться блоком catch или описываться в сигнатуре метода. Unchecked могут не обрабатываться и не быть описанными. Можно ли обработать непроверяемое исключение? Обрабатывать можно, но делать этого не стоит. Разработчику не предоставлены инструменты для обработки ошибок системы и виртуальной машины. Нужно ли ловить Error исключения? Технически, Error как и любой другой Throwable можно поймать в блок catch. Такой код абсолютно валидный и скомпилируется без проблем. Как бросить исключение? Можно ли бросить НЕ новое исключение? Throw (экщемпляр Exception) Можно (создать экземпляр в классе Exception и бросить его) Расскажи про информацию, которая находится внутри исключения? Как с ней работать? - Причина ошибки(cause); - Возможно, присутствует сообщение об ошибке; - StackTrace - список методов, которые были вызваны до момента, когда в приложении произошло исключение; - Список подавленных исключений. Мы видим название исключения, которое произошло. Так же часто присутствует сообщение, где описывается, что мы сделали не так. А в StackTrace мы видим, где конкретно произошла ошибка. Что возвращает getStackTrace()? Используя метод getStackTrace() можно получить массив элементов StackTraceElement, каждый из которых содержит информацию об одном методе. Все элементы вместе и образуют stack trace. Какую информацию можно получить из StackTraceElement? StackTraceElement хранит информацию по одному элементу stack trace — т.е. по одному методу из StackTrace. Используется как массив элементов StackTrace. Стек — это структура хранения данных, в которую можно добавлять элементы и из которой можно забирать элементы. Причем брать элементы можно только с конца: сначала последний добавленный, потом — предпоследний, и т.д. Что такое подавленные исключения? Как достать подавленное исключение? Подавленное исключение – это исключение, которое выбрасывается, но каким-то образом игнорируется. Часто в Java – это когда блок finally создает исключение, а любое исключение, первоначально возникшее в блоке try , подавляется. Получить доступ к подавленному исключению возможно, например, если использовать метод addSuppressed() в блоке finally и передать в качестве параметра исходное исключение из блока catch через промежуточную переменную, чтобы исключение не потерялось. Какую информацию можно получить из StackTraceElement? StackTraceElement хранит информацию по одному элементу stack trace — т.е. по одному методу из StackTrace. Используется как массив элементов StackTrace. Расскажи про конструкцию try-catch-finally? try – определяет блок кода, в котором может произойти исключение; catch – определяет блок кода, в котором происходит обработка исключения; finally – определяет блок кода, который является необязательным, но при его наличии выполняется в любом случае независимо от результатов выполнения блока try. Можно ли обрабатывать разные исключения в одном блоке catch? • Можно, с помощью оператора “или” «|» необходимые исключения: catch( IOException | SQLException ex ) Обязателен ли блок finally? Конструкция try-finally • Оператор finally не обязателен, однако каждый оператор try требует наличия либо catch, либо finally. А catch? • Catch обязателен ели нет finally. Такая запись допустима, если имеется связка try finally. Но же лучше иметь блок catch в котором будет обрабатываться необходимое исключение. Когда будет выполнен finally? • Код в блоке finally будет выполнен всегда. За исключение нескольких случаев. Когда не будет выполнен (4 случая)? - Если вы вызываете System.exit(); - Если сначала произойдет сбой JVM; - Если JVM достигает бесконечного цикла (или другого не прерывающегося, не заканчивающегося оператора) в блоке try или catch; - Если ОС принудительно завершает процесс JVM специально или из-за ошибки, например: сбой питания, аппаратная ошибка итп. Разница try catch и if В if нельзя поймать и обработать ошибки, просто проверить условие; Исключения позволяют сделать код чище и понятнее, поскольку с их помощью можно разделить выполнение действий и обработку ошибок. Что такое try-with-resources? Как работает эта конструкция? try (Класс имя = new Класс()) { Код, который работает с переменной имя } Try-with-resources – это еще одна разновидность оператора try. После ключевого слова try нужно добавить круглые скобки, а внутри них — создать объекты с внешними ресурсами. Для объекта, указанного в круглых скобках, компилятор сам добавит секцию finally и вызов метода close(). Что такое ресурс в конструкции try-with-resources? - Ресурсом называется объект, являющийся экземпляром класса, который реализует интерфейс java.lang.AutoCloseable или java.io.Closable - Можно указывать несколько ресурсов разделяя их точкой с запятой. Закрываться эти ресурсы будут в порядке, обратном их объявлению. - Возможно использование в try-блоке ресурсы, объявленные вне try-блока. - Ресурс становится final и его нельзя изменить. При выходе из блока try-with-resources будет вызван метод close() и освобождены все ресурсы. Что если исключение вылетело сначала в try, а потом в close в конструкции try-with-recources? Брошенное try-блоком исключение имеет больший приоритет, чем исключения, получившиеся во время закрытия. В конструкции try-finally наоборот, исключение из finally перекроет исключение в try. Какое исключение вылетит? Исключение в try перекроет исключение в close Что будет с другим? Исключение будет подавленно, и его можно получить через метод getSuppress. Когда происходит закрытие ресурса в конструкции try-with-resources если в try возникло исключение: до перехода в catch или после того, как catch отработает? catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally(ментор сказал в неявном try catch), который компилятор сам неявно создаёт. Расскажи, как правильно ловить исключения? Иерархия catch блоков В Java исключения ловят и обрабатывают с помощью конструкции try/catch/finally. При заключении кода в один или несколько блоков try указывается потенциальная возможность выбрасывания исключения в этом месте, все операторы, которые могут сгенерировать исключение, помещаются в этом блоке. В блоках catch перечисляются исключения, на которые решено реагировать. Тут определяются блоки кода, предназначенные для решения возникших проблем. Это и есть объявление тех самых получателей/обработчиков исключений. Иерархия Порядок объявления в блоке catch должен быть от низкого наследника к более высокому, если исключения наследуются друг от друга. Как создать, выбросить, поймать свое исключение? Необходимо создать класс и унаследоваться от базового класса требуемого типа исключений (например, от Exception или RuntimeException). Руководствоваться нужно определением типа исключения. В зависимости от того, что необходимо обрабатывать. В конструкторе класса своего исключения можно передать в конструктор базового класса исключения (например Exception) сообщение об ошибке используя ключевое слово super(message). Что бы в дальнейшем использовать свое исключение, нужно воспользоваться ключевым словом throws с названием исключения в строке объявления метода после скобок с параметрами. И сгенерировать исключение с помощью оператора throw: throw new имя исключения, внутри метода. Поймать исключение можно через try catch, указывав в блоке catch имя исключения. Где возможно вызывать исключения? В любом месте кода с помощью throw new Exception();. Какие есть уровни логирования и для чего они нужны? Уровни журналов используются для классификации их по степени серьезности или влиянию на стабильность приложения. - SEVERE (серьезные ошибки программы) - WARNING (предупреждение) - INFO (информационное сообщение) - CONFIG (конфигурационные параметры) (детальное логирование) - FINE (сообщение об успешной операции) - FINER - FINEST - OFF(отключить) - ALL(записывать все) Обязательно ли передавать в метод getLogger() имя класса? Нет не обязательно, можно передать любой строковый параметр. Но желательно. Почему так принято? - Легко проверить класс ведения журнала, так как имя журнала будет отображаться в файле журнала. Можно быстро перейти к определенному классу. - Не нужно беспокоиться о дублировании имен журналов в сложном приложении. Имя всегда будет уникальным. Сообщения каких уровней мы увидим, задав уровень INFO? - SEVERE (серьезные ошибки программы) - WARNING (предупреждение) - INFO (информационное сообщение) Как Java понимает какой уровень главнее при установке .setLevel(). В классе Level первым параметром идет строковое название уровня логирования, а вторым параметром int значение приоритета. У уровня info приоритет 800 у warning 900, чем больше значение, тем выше приоритет. |