本文不科普checked exception和unchecked exception,如果不知道这两者区别的童鞋可以参考其他文章。
进入正题。
个人认为,当开发人员知道如何处理异常时应使用checked exception。但又一个问题来了:什么叫“知道”?什么叫“不知道”?
我认为
1. 使用checked exception的情况:异常在运行时出现是正常的,是我们期待的,出现后不会影响程序继续正常工作的,开发人员应该知道此类异常出现后程序的运行方向的。
最典型的例子就是业务异常。比如用户输入的数据之间有一定的关系,不满足这种关系时需要提示用户,虽然可以采用在biz层直接返回字符串信息的方式,但很多时候该方法需要返回的数据不是一个字符串,这个时候运用异常就很方便。下面是示例代码:
public class DemoService {
public Goods findGoods(Customer customer, Long goodsId) throws BizException {
if (validateCustomerAndGoods()) {// 此处有一个查找货物并验证客户和货物关系的业务逻辑
throw new CustomerAndGoodsMismatchException("此客户无权查看此货物");
}
return goods;
}
}
@RestController
public class DemoController {
@GetMapping("/findGoods")
public Result findGoods(Customer customer, Long goodsId) {
Result result = new Result();
try {
Goods goods = demoService.findGoods(customer, goodsId);
result.setStatus(200);
result.setData(goods);
} catch (BizException e) {
result.setStatus(400);
result.setData(e.getMessage());
}
return result;
}
}
有的童鞋可能会疑惑,这种情况也可以用uncheck exception啊,我的回答是,没错。但如果用uncheck exception,编译器不会给你任何提示,很可能上线了之后你才发现,卧槽,这还有一个异常忘了处理!
2. 使用unchecked exception的情况:异常不应该在运行时出现的,如果出现通常要修改程序才能避免的,开发人员在处理该异常时除了向外抛或者简单打印之外无能为力的。
比如SQLException,出现这种异常,一般都是SQL写的有问题,只能修改源代码解决,即使捕获这种异常,在运行时除了直接抛或者打印出来没有任何其他能根本解决该类问题的办法。