java catch块_用Java编写带有清除操作的catch块

我找不到关于Java中catch块的任何建议,这些建议涉及一些清除操作,这些清除操作本身可能会引发异常.

经典的示例是stream.close()的示例,通常在finally子句中调用它,如果抛出异常,我们可以通过在try-catch块中调用它来忽略它,或者声明它被重新抛出.

但总的来说,我该如何处理以下情况:

public void doIt() throws ApiException { //ApiException is my "higher level" exception

try {

doLower();

} catch(Exception le) {

doCleanup(); //this throws exception too which I can't communicate to caller

throw new ApiException(le);

}

}

我可以做:

catch(Exception le) {

try {

doCleanup();

} catch(Exception le1) {

//ignore?

//log?

}

throw new ApiException(le); //I must throw le

}

但这意味着我将必须进行一些日志分析以了解清理失败的原因.

如果我这样做了:

catch(Exception le) {

try {

doCleanup();

} catch(Exception le1) {

throw new ApiException(le1);

}

结果导致丢失了将我带到第一拳的陷阱区的文件.

人们在这里使用哪些成语?

>在throws子句中声明较低级别的异常?

>清除操作期间是否忽略异常?

解决方法:

首先,确定您是否真的需要从finally块中抛出-请仔细考虑-在close()调用失败的情况下…好吧,记录下来就可以了-但是您的API的更高层真正可以做什么关于这个问题?因此,对于99%的情况,您将记录辅助数据库,然后重新抛出主数据库.

接下来,如果您确实需要抛出第二个异常,请确定导致第二个异常的各种原因是否重要.他们是很少见的.因此,将次要原因设置为主要原因(使用适当的构造函数或initCause()).

最后,如果必须抛出辅助节点,并保留辅助节点和主节点的完整堆栈跟踪,那么您将创建一个自定义Exception来处理这种情况.这很丑陋,因为您可能想从不同的父类派生.如果确实出现这种情况,我建议创建一个辅助类,该类能够填充目标异常的堆栈跟踪,从而根据两个异常生成有意义的跟踪(请确保对第二个异常使用缩进,因此嵌套的异常是容易拉开).

但大多数情况下,我建议您使用对数和重新抛出原语范式.专注于解决主要问题,次要问题通常会自行解决(这里的经典示例是IO异常,它使事情变得如此糟糕,以至于close()的调用也无法成功).

标签:exception,exception-handling,java

来源: https://codeday.me/bug/20191210/2099032.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值