C#异常处理:重试10次后重抛的异常能否被最后一个catch块捕获?
结论
重试次数满10次后不会触发CleanUp()方法,你抛出的new Exception()不会被当前方法的最后一个catch块捕获。
原因说明
同一个try块对应的catch分支,只能捕获这个try花括号内部抛出的异常,你的异常是在catch (MyException e)的代码块里抛的,已经不在最外层try的覆盖范围内,所以当前方法的第二个catch根本接不到这个异常。
完整的执行流程是这样的:
- 首次执行
Process(),try块内抛出MyException,进入第一个catch分支 - 重试次数≤10时,递归调用
Process(),重复上面的逻辑 - 当某次递归调用中
GetRetries()返回值大于10时,会在当前这层递归的catch (MyException e)块里抛出Exception("Giving up!") - 这个异常不会被当前层的第二个
catch捕获,而是会向上抛到上一层递归的Process()调用位置,最终会溢出到最上层调用方,全程不会走CleanUp()逻辑。
修复建议
如果要实现重试超10次后自动执行CleanUp(),可以调整逻辑:
要么直接在retries > 10的分支里调用CleanUp()再结束逻辑,要么给递归调用的Process()套一层try-catch捕获内部抛出的异常。
内容的提问来源于stack exchange,提问作者silent
相关产品推荐
相关产品推荐

