2013-05-19 6 views
1

Я наткнулся на базу кода, которая читает текстовый файл и анализирует его. Я немного смущен тем, как используются исключения. В отдельном классе AppFileReaderException определены исключения extends, где расширенный класс возвращает сообщение об ошибке для исключения. Кроме того, функция getSymbol() использует как throws, так и try and catch block. Функция error() имеет обработчик исключений, который может привести к вложенным исключениям! Есть ли какое-либо преимущество в выполнении такой обработки исключений, когда основная попытка и улов должны быть достаточными? Есть ли причина продления класса исключений, объедините оба блока throws и try-catch? Являются ли они более убитыми или есть веская причина иметь такие конструкции?Обработка вложенных исключений Java

package AppName;  
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.LineNumberReader; 

public class AppFileReader { 


    // 
    public char getSymbol() throws AppFileReaderException { 
     try { 

     //do something 

     } catch (Exception e) { 
      error("IO Error: " + fileName + "@" + currentLineNumber); 
     } 
     return somechar; 
    } 


    public void error(String errorMsg) throws AppFileReaderException { 
     throw new AppFileReaderException(errorMsg); 
    } 

    public AppFileReader(String fileName) throws FileNotFoundException { 
     reader = new LineNumberReader(new FileReader(fileName)); 
     this.fileName = fileName; 
    } 

} 

// ----------------------------------------- -------------------------

расширенного класса для AppFileReaderException выглядит следующим образом:

package AppName; 
public class AppFileReaderException extends Exception { 


    public AppFileReaderException(String msg) 
    { 
     super(msg); 
    } 
} 

ответ

2

Во-первых, error() метод (не функция!) не имеет никакой обработки. Он просто выдает исключение с данным сообщением.

Создание собственных классов исключений может быть полезно при вызове методов; так что вы можете сделать что-то вроде

public void methodThatCallsLibrary() { 
    try { 
     doSomething(); 
     new AppFileReader().getSymbol(); 
     doOtherSomething(); 
    } catch (AppFileReaderException afre) { 
    // handling specific to appFileReader 
    } catch (Exception e) { 
     // handling related to the rest of the code. 
    } 
} 

При этом система здесь немного странная. Создав исключение в методе error(), stacktrace исключения является одинаковым для всех возможных мест, где возникает исключение. Кроме того, похоже, что он просто маскирует IOException, поэтому я бы, вероятно, пошел на пересылку самого IOException (и, если нет, включил вложенное исключение в исключение, которое, наконец, было выброшено, чтобы дать лучшую информацию об отладке).

0

Система проверенных и непроверенных исключений в Java была экспериментальной, но большинство программистов полагают, что это не было хорошей концепцией. Кроме того, проверенная иерархия исключений плохо разработана, например, если вы что-то делаете с отражением, вам нужно поймать 4 или 5 отдельных исключений.

На практике почти каждый код bean-кода в современном веб-приложении вызывает некоторые функции, которые что-то делают с IO, SQL (и, возможно, отражением), поэтому с проверенной системой исключений вы бы имеете множество исключений для обработки или добавления в подпись функции.

Модель программирования Java, предлагаемая, например, весной, заключается в прозрачной обработке исключений. У вас есть интерфейс для обслуживания, реализация может использовать WebService, базу данных SQL или что-то еще. Как вы можете узнать, какие исключения обрабатывать и как? Поэтому вы предоставляете свою собственную иерархию исключений, которую вы можете обрабатывать в одном месте.

Весна также охватывает все исключения в NestedRuntimeException.

Вы также можете обрабатывать исключения в аспектах или фильтры. В этом случае исключения должны быть полностью прозрачными для вашего бизнес-кода. Вы полностью исключаете обработку исключений из обычной обработки.

2

Получая свои собственные исключения из базовых класса исключений является очень хорошей идеей, поскольку

1) вы можете иметь дело с объектами разного исключения отдельно.

2) функции часто имеют «броски ...», которые сообщают вызывающему, какие исключения ожидать. Это помогает стабильности программы.

Помните, что Java имеет multicatch синтаксис исключения:

Выгоду (exception1 | exception2 | ... е) где е пойманная объект. Используйте это, если вы хотите одинаково относиться к таким типам исключений.

Смежные вопросы