Rethrow Exception Real Application - PullRequest
       13

Rethrow Exception Real Application

0 голосов
/ 10 октября 2018

В Java 7 добавлена ​​функция исключения Rethrow. Я знаю, что это за концепция, но я хочу увидеть ее реальное применение и зачем нужна эта функция?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Я возьму примеры из здесь Это пример:

  static class FirstException extends Exception { }
  static class SecondException extends Exception { }

  public void rethrowException(String exceptionName) throws FirstException, SecondException {
    try {
      if (exceptionName.equals("First")) {
        throw new FirstException();
      } else {
        throw new SecondException();
      }
    } catch (FirstException e) {
      throw e;
    }catch (SecondException e) {
      throw e;
    }
  }

Это компилируется как с Java 6, так и с 7.

Если вы хотите оставить галочкуисключения из сигнатуры метода, вы должны хранить громоздкие предложения catch в java 6.

В Java 7 вы можете сделать это следующим образом:

public void rethrowException(String exceptionName) throws FirstException, SecondException {
  try {
    if (exceptionName.equals("First")) {
      throw new FirstException();
    } else {
      throw new SecondException();
    }
  } catch (Exception e) {
    throw e;
}

Таким образом, ваше преимущество в том, что у вас меньшегромоздкий пункт поймать.

0 голосов
/ 10 октября 2018

Пара вариантов использования:

  1. Используя rethrow, вы можете редактировать информацию трассировки стека , чтобы сделать ее более точной.Также при необходимости вы можете скрыть или удалить ненужные внутренние детали в трассировке стека.

    try     { //... }
    catch (Exception e) { throw (Exception) e.fillInStackTrace(); }
    

    Реальное применение fillInStackTrace очень хорошо объяснено здесь: Почему метод Throwable.fillInStackTrace () общедоступен?Зачем кому-то его использовать?

    Цитата из книги «Мышление на Java», написанной Брюсом Эккелем:

    Если вы хотите установить новую информацию трассировки стека, вы можетеСделайте это, вызвав fillInStackTrace( ), который возвращает объект Throwable, который он создает, вставив информацию о текущем стеке в старый объект исключения

  2. Добавьте настраиваемое сообщение к выброшенному исключению. Добавление настраиваемого сообщения в выброшенное исключение при сохранении трассировки стека в Java

Простой пример, который я могу себе представить:

void fileOperator(String operationType) throws Exception(){ ... }

void fileReader() throws Exception {
    try{
        fileOperator('r');
    }
    catch(Exception e){
        throw Exception("Failed to read the file", e);
    }
}

void fileWriter() throws Exception{
    try{
        fileOperator('w');
    }
    catch(Exception e){
        throw Exception("Failed to write the file", e);
    }
}

Кроме того, мыможет выдать более конкретный тип исключения (скажем, FileReadException, FileWriteException) из блока catch.

0 голосов
/ 10 октября 2018

Использование Повторное создание исключений с более инклюзивной проверкой типов функция

в Java SE 7, вы можете указать типы исключений FirstException и SecondException в предложении throws в объявлении метода rethrowException

Когда вы хотите объявить определенные исключения, которые могут быть сгенерированы (в основном, когда вы обнаруживаете общую ошибку)

Например, см. Precise Rethrowпример :

public static void precise() throws ParseException, IOException{
    try {
        new SimpleDateFormat("yyyyMMdd").parse("foo");
        new FileReader("file.txt").read();
    } catch (Exception e) {
        System.out.println("Caught exception: " + e.getMessage());
        throw e;
    }
}

Это также делает ваш код совместимым с необработанным правилом исключения Sonar .

Обратите внимание, что вы можете поймать аналогичным образом Throwable

...