You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:47:42