try{
}catch(){}
finally{
try{
}catch(){ }
fianlly{ }
}
Хорошо ли иметь код, как указано выше?
try{
}catch(){}
finally{
try{
}catch(){ }
fianlly{ }
}
Хорошо ли иметь код, как указано выше?
Да, вы можете это сделать.
Собственно, вам даже нужно делать это при работе с потоками, которые вы хотите закрыть должным образом:
InputStream in = /* ... */;
try {
} catch (...) {
} finally {
try {
in.close();
} catch (...) {
} finally {
}
}
Я не вижу случая, когда это было бы плохой практикой
Для удобства чтения вы можете разделить вложенный 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;
}
}
Выглядит уродливо, но иногда это путь. В зависимости от кода рассмотрим извлечение метода со вторым блоком try-catch-finally.
Лучше избегать этого, когда вы можете, но иногда это может быть необходимо. Если вы расскажете нам больше о том, почему вы думаете, что вам это нужно, мы сможем дать лучшие ответы: -)
Одной из причин, по которым можно подумать, может быть совершение транзакции в блоке finally
, когда сама операция фиксации может выдать исключение.
Важно отметить, что исключения, брошенные внутри блока finally, могут легко теневое исключение, которое было выбрано ранее, в блоке try
, если оно не обрабатывается должным образом. Таким образом, такие вложенные блоки try/catch иногда подходят. Однако, как отмечали другие, для повышения удобочитаемости рекомендуется извлечь внутренности блока finally
в отдельный метод.
Это некрасиво, но бывают случаи, когда вы не можете избежать этого, особенно в очистке ресурсов, где у вас есть зависимые ресурсы, и очистка одного ресурса может вызвать исключение.
Типичным примером является удаление объектов ResultSet, Statement и Connection в коде JDBC. Закрытие ResultSet может вызвать исключение, но мы все равно хотели бы продолжить и закрыть Statement и Connection