抛出与抽象相对应的异常
如果在某个方法中抛出的异常与该方法本身没有联系,即:异常产生于更低层,那么往往我们不容易准确的判断异常产生的原因
异常转译:更高层的实现应该捕获低层的异常,同时抛出对高层进行解释的异常,这就是异常转译
// 低层异常
class CarWrongException extends Exception {
private static final long serialVersionUID = 1L;
public CarWrongException(String message, Throwable cause) {
super(message, cause);
}
public CarWrongException(String message) {
super(message);
}
}
// 高层异常
class LateException extends Exception {
private static final long serialVersionUID = 1L;
public LateException(String message, Throwable cause) {
super(message, cause);
}
public LateException(String message) {
super(message);
}
}
class Car {
public void run() throws CarWrongException{
int a = 2;
if(a == 2) {
throw new CarWrongException(“车,爆胎了”);
}
System.out.println(“开着车去上班”);
}
}
class Worker {
private Car car = null;
Worker(Car car){
this.car = car;
}
public void gotoWork() throws LateException {
try {
car.run(); // 正常开车去上班
System.out.println(“开心”);
}catch(CarWrongException e) {
e.printStackTrace(); // 车抛锚了,出现异常
this.walk();
throw new LateException(“迟到的原因:” + e.getMessage(), e);
}
}
private void walk() {
System.out.println(“走路上班”);
}
}
public class WhyDemo {
public static void main(String[] args) {
Car c = new Car();
Worker worker = new Worker©;
try {
worker.gotoWork();
System.out.println(“老板给我奖金”);
}catch(LateException e) {
System.out.println(“打我”);
e.printStackTrace();
}
}
}
上诉代码很好的解释了异常的转译,使用异常的转译后,异常的产生有了更加清楚的展示
异常链:如果我们在高层需要低层异常的异常信息,那么我们可以通过异常链的形式将低层异常信息进行传递
对于大部分的异常类来说,都提供了相应的构造器进行异常对象的传递,而少部分的异常类没有定义相应的构造器,则可以使用initCause方法进行设置
异常转译不能滥用
try {
access the database
} catch(Exception e) {
logger.log(level, message, e);
throw e;
}
上述代码是个很好的例子使用异常转译,我们可以通过这种方式记录信息