其实这种时候需要根据场景去判断。下面两个场景让我们切身感受一下;
1:什么时候应该捕获异常并抛出异常?
2:什么时候只捕获异常而可以不抛出异常?
场景1:你在某宝/某东/某多多购物车选好了商品,点击了付款操作。
场景2:你使用手机查看天气预要获取最新的天气数据。
上测试代码:
package exception;
public class Test {
public static void main(String[] args) {
try {
checkAccountBalance();
}catch (Exception e){
System.out.println("付款结果:"+e);
}
//换行
System.out.println();
System.out.println("==================================分割线====================================");
//换行
System.out.println();
try {
checkTrafficConditions();
}catch (Exception e){
System.out.println("获取天气结果:"+e);
}
}
//假设这是一个购物付款场景
public static void checkAccountBalance() throws Exception {
System.out.println("付款场景:开始付款");
int a=1;
int b = 0;
try {
//用除数为0模仿付款异常
System.out.println(a/b);
}catch (Exception e){
System.out.println("付款异常"+e.getMessage());
throw new Exception("余额不足");
}
System.out.println("付款成功");
}
//假设这是你手机使用天气软件获取最新的天气场景
public static void checkTrafficConditions(){
System.out.println("天气预报:开始获取最新天气数据");
int a=1;
int b = 0;
try {
//用除数为0模仿获取最新天气异常
System.out.println(a/b);
}catch (Exception e){
System.out.println("最新天气数据异常"+e.getMessage());
}
System.out.println("使用缓存的历史天气数据");
}
}
查看运行结果如下:
分析一下场景:对于付款这种场景就适用于捕获到异常并抛出,如果只捕获异常而不抛出则代码会继续向下执行。这势必会造成“一错再错” 。
对于第二个天气预报例子(似乎列举的有些不恰当,感觉怪怪的。有合适的例子欢迎在评论区举例),不抛出异常对调用者没有特别大的影响、甚至可以忽略不计。就可以捕获异常即可而不需要抛出
下面看一下错误的使用场景:
上测试代码:
package exception;
public class Test {
public static void main(String[] args) {
try {
checkAccountBalance();
}catch (Exception e){
System.out.println("付款结果:"+e);
}
//换行
System.out.println();
System.out.println("==================================分割线====================================");
//换行
System.out.println();
try {
checkTrafficConditions();
}catch (Exception e){
System.out.println("获取天气结果:"+e);
}
}
//假设这是一个购物付款场景
public static void checkAccountBalance(){
System.out.println("付款场景:开始付款");
int a=1;
int b = 0;
try {
//用除数为0模仿付款异常
System.out.println(a/b);
}catch (Exception e){
System.out.println("扣款异常"+e.getMessage());
}
System.out.println("付款成功");
}
//假设这是你手机使用天气软件获取最新的天气场景
public static void checkTrafficConditions() throws Exception {
System.out.println("天气预报:开始获取最新天气数据");
int a=1;
int b = 0;
try {
//用除数为0模仿获取最新天气异常
System.out.println(a/b);
}catch (Exception e){
System.out.println("最新天气数据异常"+e.getMessage());
throw new Exception("天气数据获取失败");
}
System.out.println("使用缓存的历史天气数据");
}
}
运行结果:
场景1:当我们已经捕获到扣款异常,按正常情况应该抛出异常终止方法中得后续代码执行,让调用者知道做出下一步处理而不是像代码中这样继续执行下一步操作造成业务问题。对于第二个例子亦是如此获取最新数据失败,那么我们就可以继续使用历史数据(针对于个人来说天气预报使用历史数据影响不会太大,当然如果客户(航班)对天气数据要求十分精准那么此处抛出异常就是正确的,需要调用者针对这种情况做出相应的处理方式),只需捕获异常日志打印提示一下就行,而不需要中断代码得执行。
总结一下,就是根据场景做出选择。