Подтвердить что ты не робот

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

 try{
  }catch(){}
  finally{
     try{
      }catch(){ }
     fianlly{ }
  }

Хорошо ли иметь код, как указано выше?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

public static boolean cleanup(Closeable stream)
{
try{
    stream.close();
    return true;
  }catch(){
    return false;
  }
}

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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