Как обрабатывать локализованные исключения? - PullRequest
2 голосов
/ 15 сентября 2011

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

Есть ли лучший способ справиться с ситуацией ниже?

private DataHandler retrieveFromGridFS(ObjectId id) throws IOException
{
    GridFS gridFS = new GridFS(getDBReference());        
    GridFSDBFile out = gridFS.find(id);

    File temp = File.createTempFile(
            (String)out.getMetaData().get("productName"), 
            (String)out.getMetaData().get("productType"));

    out.writeTo(temp);

    return new DataHandler(new FileDataSource(temp));        
}

Приведенный выше метод private может выдать IOException.

Использование этого метода примерно так:

public DataHandler retrieveProduct(String productId) throws IOException
{
    ObjectId id = new ObjectId(productId);
    DataHandler handler = null;

    try
    {
        handler = retrieveFromGridFS(id);
    }
    catch(IOException ex)
    {
        logger.error(ex);
        throw new IOException("A problem occurred retrieving product.");
    }

    return handler;
}

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

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Это полностью зависит.

Во-первых, вы действительно хотите перенаправить IOException на верхние уровни или инкапсулировать различные исключения, которые могут возникнуть на нижних уровнях в исключении для конкретного приложения?

Нужно ли уметь восстанавливаться после этого исключения? Если нет, то подходит ли RuntimeException? (Даже если вам действительно нужно исключение для восстановления, вы работаете в среде, которая обеспечивает декларативную обработку исключений на высоком уровне?)

Имеет ли смысл использовать шаблон NullObject, чтобы избежать возврата нулевого значения?

(и т. Д.)

0 голосов

Что? Похоже, что retrieveProduct - это просто удобная функция, чтобы делать то, что делает retrieveFromGridFS, но с String в качестве идентификатора вместо ObjectId. Так не должен ли набор исключений, который он может вызвать, быть таким же, как у retrieveFromGridFS?

0 голосов
/ 15 сентября 2011

Вообще говоря, перехватите исключение, если вы можете ответить на событие, которое произошло .Ex.допустим, у вас есть код для повторной попытки соединения в случае сбоя.Тогда у вас может быть цикл, который перехватывает IOException и повторяет попытку x раз.Вызывающая сторона выше не заботится об основных ошибках.

Когда возникает исключение, с которым вы не можете справиться, вы этого не сделаете.По сути, вы попадаете на попку.

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

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