Часть 1. Основы ООП Исключения.
Структурный подход Неисправимые ошибки – вывести информацию и умереть. Исправимые ошибки – уведомить вызывающую функцию через возвращаемое значение. int open(const char * filename) Возвращает -1, если открыть файл не удалось.
Недостатки Легко забыть проверить код возврата. Код ужасен! if ( ( result = open ( 1.txt ) ) < 0 ) {... } if ( ( result = open ( 2.txt ) ) < 0 ) {... }
Недостатки Как обернуть ошибку? int LoadDataFromFiles () { if ( ( result = open ( 1.txt ) ) < 0 ) return 1;... } Описание ошибок, произошедших в функции LoadDataFromFiles, сложно вернуть выше.
Исключения Ошибка описывается объектом класса. if ( aName.length() == 0 ) throw new IllegalArgumentException ( Name cannot be empty). Сообщение об ошибке – выполнение инструкции throw с новым созданным объектом, описывающим ошибку, в качестве аргумента.
Типы исключений Класс исключения – наследник Error, Exception или RuntimeException. Обработчик сообщает, ошибки какого класса он умеет контролировать, и подходит также для наследующих классов. Throwable Error Нельзя контрол. Exception Runtime Exception Необяз. контрол. Обязат. контрол.
Обработчики исключений try { // readLine return new BufferedReader( new InputStreamReader( System.in)).readLine(); } catch (IOException e) { return new String(); // можно throw } Если исключение не обработано, можно повторить его throw. Иначе выполнение продолжится за блоком try-catch.
Обработчики исключений class FileReader implements Reader { // Код неполный! public byte read() {... if ( CannotReadFromFile ) throw new IOException(); if ( FileIsOver ) throw new EOFException();... }
Обработчики исключений Класс EOFException наследует от IOException. try {... } catch(IOException e ) {... } catch(EOFException e ) {... } Выбирается наиболее специфичный обработчик, но подходит обработчик для базового класса. Исключения из main обрабатываются так: System.out.println(e.printStackTrace());
Разматывание метода class FileWriter implements Writer { // Код неполный! public void writeByte(byte aByte) {... if ( CannotWriteToFile ) throw new IOException();... } Если метод writeByte не справился, будет сгенерировано исключение.
Разматывание метода class PlainEncodingAlgorithm... { // Код неполный! public void encode(Reader Source, Writer Destination) {... Destination.writeByte ( myBuffer );... } Метод encode не контролирует генерацию исключения методом writeByte.
Контроль за ошибками Контролируемые исключения обязательно декларировать. public void writeByte(byte aByte) throws IOException Если метод не обрабатывает контролируемое исключение, он также декларирует его. public void encode(Reader r, Writer w) throws IOException
Генерация исключения При генерации запоминается стек вызовов. System.out.println( e.printStackTrace()); При генерации может запоминаться исключение-причина ошибки. catch(HisException exc) { throw new MyException(exc); }
Блок finally Код внутри блока finally выполняется вне зависимости от того, случилось исключение или нет. try {... } finally {... }