我可以捕获java.lang.Exception而不是它的具体子类吗?

时间:2011-02-08 12:22:55

标签: exception-handling

我是否可以捕获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()方法不会抛出任何其他类型的异常(至少目前为止)。我可以这样做吗?

注意NoWaterExceptionNoSoilExceptionNoSunshineException不能是TreePlantExcetpion的子类。它们不在同一个继承层次结构中。

关键是,如果所有捕获的异常的异常处理相同,我可以抓住他们的超类,即java.lang.Exception吗?

1 个答案:

答案 0 :(得分:2)

创建TreePlantException的NoWaterExceptionNoSoilExceptionNoSunshineException子类,您可以跳过整个try / catch,因为TreePlantException已被声明为抛出。