Должен ли я поймать проверенное исключение намеренно? - PullRequest
0 голосов
/ 27 мая 2011

Я разработал обработку загруженных файлов следующим образом:

UploadFileHandler - это основной класс, предоставляющий методы проверки.

public class UploadedFileHandler {

    public static void handleUploadedFile(String fileName) {
        try {
            checkFile(fileName);
        } catch (BadUploadedFileException ex) {
            deleteFile(fileName);
        }
    }

    private static void checkFile(String fileName) {
        new UploadedFileChecker(fileName).check();
    }

    private static void deleteFile(String fileName) {
        //...code to delete the file.
    }
}

И UploadedFileChecker выполняет проверку.

public class UploadedFileChecker {
    private String fileName;

    public UploadedFileChecker(String fileName) {
        this.fileName = fileName;
    }

    public void check() throws BadUploadedFileException {
        checkFileFormat();
        scanVirus();
    }

    private void checkFileFormat() {
       // if file format unsupported
       throw new BadUploadedFileException();
    }

    private void scanVirus() {
        // if contains virus
        throw new BadUploadedFileException();
    }
}

А исключение BadUploadedFileException объявлено следующим образом:

* * 1010

Я позволил ему расширить RuntimeException, поскольку он делает код в UploadedFileChecker чистым, но при этом делает его непроверенным исключением. Таким образом, перехват в handleUploadedFile является недействительным, поскольку мы не должны перехватывать непроверенные исключения.

Мой вопрос заключается в том, должен ли я перехватить исключение BadUploadedFileException или сделать так, чтобы оно расширяло исключение, и добавить «throws BadUploadedFileException» к каждому методу UploadedFileChecker.

Ответы [ 6 ]

2 голосов
/ 27 мая 2011
since we should not catch unchecked exceptions.

Нет такого правила.Вы ловите любые исключения, когда знаете, что с ним делать.

Однако, никогда не нужно ловить ошибки!

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

Исключения следует использовать для исключительных условий. Вещи, которые вы не ожидаете, чтобы случиться.

Вы не должны использовать их для условной логики.

Джош Блох в общих чертах описывает это в своей книге, которая весьма хороша и обязательна для ИМХО:

http://java.sun.com/docs/books/effective/

0 голосов
/ 27 мая 2011

Последний вариант будет предпочтительнее. Я не думаю, что это делает код намного труднее для чтения, и, по крайней мере, вы (и ваши коллеги в будущих версиях) не забудете справиться с ним.

Кроме того, безусловно, не запрещено отлавливать исключения, полученные из RuntimeException. С другой стороны, перехват RuntimeException или Exception должен выполняться только в основных методах и т. П. (Это может быть OutOfMemoryException!).

Если вы используете явные исключения RuntimeExceptions, не используйте ключевое слово throws в спецификации метода, но включайте их в JavaDoc, если они кажутся важными.

0 голосов
/ 27 мая 2011

Лично я думаю, что это должно быть проверенное исключение. Вы должны проверить. выбросить его из каждого метода обработки файлов и перехватить его в UploadedFileHandler, обрабатывая его соответствующим образом, если вам нужна другая логика обработки, тогда разбейте исключение BadUploadedFileException на несколько различных типов исключений.

Подробнее о проверенных и непроверенных исключениях здесь .

0 голосов
/ 27 мая 2011

ты собираешься что-нибудь сделать, если получишь исключение?Если нет, пусть пузырь.Если да, то вы наверняка можете поймать исключение.

0 голосов
/ 27 мая 2011

Я думаю, вам будет лучше, если check() вернет логическое значение.
Я считаю, что это сделает код более чистым, и, как сказал Брайан, исключения на самом деле не для логики, акогда что-то неожиданно идет не так.

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