如何判断finally块执行前进入的是try块还是catch块?
关于try-catch-finally中判断执行分支的问题解答
嘿,我来给你捋捋这个问题哈!首先得明确:.NET 里并没有内置的属性或方法能直接让你在finally块里判断try块是否正常执行完成(也就是没触发catch分支)。finally的设计初衷就是不管try是正常走完还是触发了异常,它都会执行,所以系统没给咱们留这种直接的标记。
你原来的写法其实是非常常规且可靠的方案,通过一个外部bool变量来追踪执行状态。不过我可以给你优化一下,因为变量初始化的时候已经是false了,catch块里其实没必要再重复赋值isSucceed = false,这样代码会更简洁:
var isSucceed = false; try { Do(); isSucceed = true; } catch(Exception ex) { // 这里可以顺便记录异常日志,方便后续排查问题 _logger.LogError(ex, "Process encountered an error"); } finally { _logger.LogInformation($"The process has been completed. Is Succeed = {isSucceed}"); }
至于你想改成的那种不用外部变量、直接获取<isTryCalled>的写法,确实没有现成的替代方式。毕竟finally块无法直接感知try块的执行结果,必须通过你自己定义的变量来传递这个状态。
如果非要纠结少写变量的话,除非你能调整Do()方法的设计——比如让它返回一个bool值表示执行成功,那代码可以改成这样:
bool isSucceed; try { isSucceed = Do(); } catch(Exception ex) { _logger.LogError(ex, "Process failed"); isSucceed = false; } finally { _logger.LogInformation($"The process has been completed. Is Succeed = {isSucceed}"); }
但说实话,这种改动意义不大,原有的写法已经足够清晰易懂了,没必要为了省个变量去折腾。
内容的提问来源于stack exchange,提问作者sabandurna
相关产品推荐
相关产品推荐

