Попробуйте /Catch или IF для обработки отсутствующих файлов?
Лучше ли пытаться / ловить исключения или использовать операторы if для обработки разных результатов?
Я пишу короткую программу на Java, чтобы скопировать файлы для удобства, и использую if для обработки события, когда файл не существует, и объявляю броски для каждого метода, но не использую try/catch.
Должен ли я вернуться и заменить эти ifs и соответствующие разделы на try/catches или это "приемлемое" программирование для обмена с небольшим сообществом пользователей?
3 ответа
Если, пропустив, вы имеете в виду, что файл всегда должен быть там, то это исключение.
Если вы имеете в виду, что отсутствующий файл является обычным (возможным или даже вероятным) происшествием, не используйте исключение.
Обычно это хороший дизайн, чтобы проверить правильность ваших входных данных (и иметь дело с неверными входными данными), прежде чем передавать их в функцию. Это обычно приводит к более легкому для чтения и более чистому коду.
Однако реальность такова, что в этом случае вам, вероятно, придется обрабатывать неверные данные независимо от того, сколько проверок выполнено перед попыткой копирования, и это потому, что даже если вы проверите, что файл существует заранее, его можно удалить позже, или может произойти другая ошибка ввода-вывода.
Единственный действительно безопасный способ справиться с отсутствующими файлами - справиться с исключением. Учти это:
if (file.exists() && file.canRead()) {
try {
is = new FileInputStream(file);
} catch (IOException ex) {
// Never happens
}
}
Фактически, случай "никогда не бывает" МОЖЕТ случиться. Например:
Если
file
на самом деле каталог, открытый не удастся. (Вы можете справиться с этим, позвонивfile.isDirectory()
, но есть и другие случаи, с которыми трудно иметь дело... например, создание файла на съемном носителе.)Предположим, что какое-то внешнее приложение удаляет файл или изменяет его разрешения в крошечном окне между этим приложением, которое проверяет файл и пытается открыть его. Там просто нет способа справиться с этим условием гонки...
Кроме того, каждый из этих тестов, вероятно, является системным вызовом. Системные вызовы стоят дорого - примерно так же дорого, как создание / создание / перехват исключения.
Таким образом, лучший способ справиться с возможностью исключений ввода-вывода при открытии файла - это LET THEM HAPPEN. Обязательно используйте File
API, помогающий диагностировать проблему, но не полагайтесь на него, чтобы избежать исключения ввода-вывода.