Помещение блока try catch finally внутри другого блока finally - PullRequest
22 голосов
/ 23 мая 2011
 try {
 } catch() {}
 finally {
     try {
     } catch() { }
     finally { }
 }

Хорошо ли иметь код, подобный приведенному выше?

Ответы [ 5 ]

30 голосов
/ 23 мая 2011

Да, вы можете сделать это.

На самом деле, вы даже обязаны это делать, когда имеете дело с потоками, которые хотите правильно закрыть:

InputStream in = /* ... */;
try {
} catch (...) {
} finally {
    try {
        in.close();
    } catch (...) {
    } finally {
    }
}

Я не вижу никакихслучай, когда это было бы плохой практикой

10 голосов
/ 23 мая 2011

Для удобства чтения вы можете выделить вложенный try-catch в отдельный метод, например:

  try{
  }catch(){}
  finally{
    cleanup();
  }

И второй try-catch может быть внутри метода очистки.

Для поддержки вышеуказанного шаблона в пакете ввода-вывода JAVA6 представляет новый класс Closeable, который реализуют все потоки, так что вы можете использовать один метод очистки следующим образом:

public static boolean cleanup(Closeable stream)
{
try{
    stream.close();
    return true;
  }catch(){
    return false;
  }
}
1 голос
/ 23 мая 2011

Это уродливо, но есть случаи, когда вы не можете избежать этого, особенно при очистке ресурсов, когда у вас есть зависимые ресурсы, и очистка одного ресурса может вызвать исключение.

Типичным примером является приведение в порядок объектов ResultSet, Statement и Connection в коде JDBC. Закрытие ResultSet может вызвать исключение, но мы все равно хотели бы продолжить и закрыть Statement и Connection

1 голос
/ 23 мая 2011

Лучше всего избегать этого, когда можете, но иногда это может быть необходимо. Если вы расскажете нам больше о том, почему вы думаете, что вам это нужно, мы сможем дать лучшие ответы: -)

Одной из причин для размышления может быть принятие транзакции в блоке finally, когда сама операция фиксации может вызвать исключение.

Важно отметить, что исключения, сгенерированные внутри блока finally, могут легко затенять исключения, сгенерированные ранее, в блоке try, если не обработаны должным образом. Таким образом, такие вложенные блоки try / catch иногда являются подходящим способом. Однако, как отметили другие, для улучшения читабельности целесообразно выделить внутреннюю часть блока finally в отдельный метод.

1 голос
/ 23 мая 2011

выглядит некрасиво, но иногда это путь.В зависимости от кода рассмотрите возможность извлечения метода со вторым блоком try-catch-finally.

...