Попробуйте / Catch или IF для обработки отсутствующих файлов? - PullRequest
4 голосов
/ 21 мая 2011

Лучше ли пытаться / ловить исключения или использовать операторы if для обработки разных результатов?

Я пишу короткую программу на Java для удобства копирования файлов и использую if для обработки события, когда файл не существует, и объявляю броски для каждого метода, но не использую try / catch.

Должен ли я вернуться и заменить эти if и связанные с ними разделы try / catches или это "приемлемое" программирование для совместного использования с небольшим сообществом пользователей?

Ответы [ 3 ]

5 голосов
/ 21 мая 2011

Если пропущено, вы имеете в виду, что файл всегда должен быть там, тогда это исключение.

Если вы имеете в виду, что отсутствующий файл является обычным (возможным или даже вероятным) случаем, не используйте исключение.

3 голосов
/ 21 мая 2011

Как правило, это хороший дизайн, чтобы проверить правильность ваших входных данных (и справиться с неверными входными данными), прежде чем передавать их в функцию. Это обычно приводит к более легкому для чтения и более чистому коду.

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

2 голосов
/ 21 мая 2011

Единственный действительно безопасный способ справиться с отсутствующими файлами - справиться с исключением. Учтите это:

if (file.exists() && file.canRead()) {
    try {
        is = new FileInputStream(file);
    } catch (IOException ex) {
        // Never happens
    }
}

Фактически, случай "никогда не бывает" МОЖЕТ случиться. Например:

  • Если file на самом деле является каталогом, то открытие не удастся. (Вы можете справиться с этим, позвонив по номеру file.isDirectory(), но есть и другие случаи, с которыми трудно разобраться ... например, создание файла на съемном носителе с ошибками.)

  • Предположим, что какое-то внешнее приложение удаляет файл или изменяет его разрешения в крошечном окне между этим приложением, которое проверяет файл и пытается открыть его. Просто нет способа справиться с этим состоянием гонки ...

Кроме того, каждый из этих тестов, вероятно, является системным вызовом. Системные вызовы стоят дорого - примерно так же дорого, как создание / создание / перехват исключения.

Итак, лучший способ справиться с возможностью исключений ввода-вывода при открытии файла - это ДАЙТЕ ИМ ПРОИЗОЙТИ. Обязательно используйте API File для диагностики проблемы, но не полагайтесь на него, чтобы избежать исключения ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...