关于异常的抛出与捕获

异常处理原则之一:延迟捕获
意思是,当异常发生时,不应立即捕获,而是应该考虑当前作用域是否有有能力处理这一异常的能力,如果没有,则应将该异常继续向上抛出,交由更上层的作用域来处理。

一个例子:某方法String readFile(String filename),会去尝试读出指定文件的内容并返回,其使用FileInputStream来读取指定文件,而FileInputStream的构造方法会抛出FileNotFoundException,这是一个Checked Exception。那么readFile方法是应该捕获这个异常,还是抛出这个异常呢?很显然应该抛出。因为readFile这个方法可能会在不同的场景下,被不同的代码调用,在这些场景中,出现“文件未找到”的情况时的处理逻辑可能是不同的,例如某场景下要发出告警信息,另一场景下可能会尝试从另一个文件中读取,第三个场景下可能需要将错误信息提示给用户。在这种情况下,在readFile方法内的作用域中,是处理不了这个异常的,需要抛出,交由上层的,具备了处理这个异常的能力的作用域来处理

在服务器端和dao段 都是抛出异常很少有捕获 捕获在客户端 因为不能吧异常抛给用户。从dao到服务器到客户端都是层层抛出 到客户端必须捕获处理 抛出异常:
1 通知信号:传递信号,需告知【调用方】
2 无能为力:【被调用方/本方法】无能力处理的异常,【调用方】有能力处理
3 框架考量:【框架】层面的需要
4 抛具体的|业务的异常,禁抛Throwable|Exception|RuntimeException

捕获异常:
1 从特殊到一般:捕获/处理N个异常的顺序
2 非稳定的代码:只捕获可能产生异常的【非稳定代码】
3 顶层调用者:必须处理异常,转换为用户可理解的内容(当我们浏览网页的时候,如果访问的网页出错,我们看到的是错误代码例如404.而不是一群看不懂的错误代码信息。而且将异常信息暴露出来也有安全风险)
4 回滚事务:手动回滚try块在事务代码中的事务
5.finally块中不能抛出异常,如果有,必须捕获(如在finally块中关闭资源)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值