Могу ли я когда-нибудь поймать java.lang.Exception вместо его конкретных подклассов? - PullRequest
0 голосов
/ 08 февраля 2011

Могу ли я когда-нибудь поймать исключение java.lang.Exception вместо его подклассов?

Рассмотрим этот сенарио:

public class Tree {
    public static Tree newInstance() throws NoWaterException, NoSoilException, NoSunshineException {
        ...
        return new Tree();
    }
}

Когда я хочу получить экземпляр Tree, я могу сделать это:

public Tree plantTree() throws TreePlantExcetpion {
    try {
        ...
        return Tree.newInstance();
    } catch (NoWaterException e) {
        throw new TreePlantExcetpion("Cannot plant a tree since no water", e);
    } catch (NoSoilException e) {
        throw new TreePlantExcetpion("Cannot plant a tree since no soil", e);
    } catch (NoSunshineException e) {
        throw new TreePlantExcetpion("Cannot plant a tree since no sunshine", e);
    }
}

Но я также могу сделать это альтернативно:

public Tree plantTree() throws TreePlantExcetpion {
    try {
        ...
        return Tree.newInstance();
    } catch (Exception e) {
        throw new TreePlantExcetpion("Cannot plant a tree", e);
    }
}

Я предпочитаю вторую реализацию метода plantTree (), поскольку он короче и понятнее, и в этом методе меня не интересуют конкретные подклассы Exception, что мне нужно сделать, это обернуть в новый TreePlantExcetpion и передать его. Вся подробная информация не будет потеряна. И я уверен, что метод Tree.newInstance () не будет генерировать никаких других типов исключений (по крайней мере, пока). Могу ли я сделать это таким образом?

Примечание : NoWaterException, NoSoilException, NoSunshineException не могут быть подклассами TreePlantExcetpion. Они не находятся в одной иерархии наследования.

Суть в том, что если обработка исключений одинакова для всех перехваченных исключений, могу ли я просто перехватить их суперкласс, т.е. java.lang.Exception вместо этого?

1 Ответ

2 голосов
/ 08 февраля 2011

Создайте NoWaterException, NoSoilException и NoSunshineException подклассы TreePlantException, и вы можете просто пропустить весь try / catch, поскольку TreePlantException уже объявлен как выброшенный.

...