Чтобы правильно обрабатывать close
, следует убедиться, что он вызван, возникает ли исключение в коде основной строки, но также следует убедиться, что если close
вызывается после исключения в основной строке и затем выбрасывает само исключение, это не приведет к отбрасыванию исключения основной строки; в зависимости от различных факторов, в том числе, был ли объект открыт для чтения или записи, может быть желательно либо пропустить переполнение основной линии (возможно, инкапсулировать информацию о закрытии сбоя), либо зарегистрировать или инкапсулировать исключение основной линии, но close
провал просачивается вверх или генерирует исключение «двойной ошибки», которое инкапсулирует обе другие.
Функция примерочного с-ресурсов в Java 7 обеспечивает довольно хорошее поведение для многих сценариев: если исключение происходит в try
, а другой в close
, последние исключения добавляются к списку подавленных исключений (которые код обработки исключений должен искать). Если предполагается, что метод должен захватывать данные с беспроводного датчика и записывать его в файл, и если вызывающий абонент ожидает, что в случае проблемы с датчиком в файле будет храниться столько информации, сколько было прочитано успешно, тогда не удалось закрыть файл может быть более важным, чем сбой датчика (если датчик, например, включает только команды «вернуть старый элемент» и «удалить старые элементы», затем , если файл закрыт правильно Исключение во время связи с датчиком означает, что любые данные, которые больше не находятся в датчике, будут в файле. Если файл не закрылся должным образом, это означало бы, что может быть постоянная потеря данных, и кому-то следует сказать об этом.
Код для обработки сценария «захват сенсора» в конечном итоге будет немного неприятным: логика считывания датчика будет размещена в блоке try
, чья finally
будет захватывать любое исключение для переменной. Блок finally
должен был бы использовать свой собственный блок try
для закрытия; если возникает исключение, выкиньте произвольное исключение writeFileCloseFailure
, которое инкапсулирует как исключение (если оно есть) из блока try
, так и исключение из close
; в противном случае сбросить исключение (если есть) из блока try
. Обратите внимание, что поскольку ioException
может представлять собой либо неспособность получить данные от датчика (несколько ожидаемый и переносимый), либо неспособность записать файл (очень плохо), упаковка в другом типе исключений позволит вызывающему пользователю различать эти условия.
Блок finally будет выполнен независимо от того, что. Поэтому я считаю, что это правильно. – sanket
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – HectorLector
Если 1.7 или выше, используйте ['try-with-resources'] (http://docs.oracle.com/javase /tutorial/essential/exceptions/tryResourceClose.html) – khachik