Попробуйте /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, помогающий диагностировать проблему, но не полагайтесь на него, чтобы избежать исключения ввода-вывода.

Другие вопросы по тегам