@
BurNFans 假设你当我是白痴…… 估计你也不会跟白痴说话吧?不分析
假设你没有当我白痴,那么一个按照预期返回了结果的函数会 crash 吗?
你认为我会连这么基本的问题都没弄清楚的话…………嗯嗯,我和你之间必定出了一个自大狂。
为什么是可能导致?这就是我想批评 golang 的问题所在了。
回到那个讨论场景, do_transaction 会调用不定多个其他函数(例如在循环体中调用),这些函数都是可以返回 err 的。
现在其中执行到某一步的时候,某个函数返回 err 了, 那 do_transaction 中要怎么判断是否终止事务?获得这个 err 之后要怎么执行回滚?
仔细想象这个问题,你就会发现,当你调用的代码并不是直接通过源码明文调用(就是说代码中直接通过函数名调用),而是间接地调用的时候, err 的信息就是模糊的,被隐藏在调用接口之下的。那这个时候 err 信息实际上是没用的。
--
问题是如何进一步扩散变得严重的呢? 现在我的某个间接调用返回了一个 err , 那么一般来说是不是意味着这个函数没有返回程序上下文期望可以继续执行下去的返回结果?
就是说 ret, err = do_sth() 总是 要么 err 为 nil 要么 ret 为 nil ,这也是 golang 为什么能歪打正着使用这种设计的前提 convention 。
但是因为 我在 do_transaction 中并不真的 清楚 调用的函数是 do_sth1 还是 do_sth2 ,那么我的 这个 err 是不是只能靠手工穷举所有的可能性?但是又因为 do_transaction 中你所间接调用到的子过程实际上是动态的,所以所有你现在源代码中的静态穷举显然是徒劳的。
那么,总是会有没被检查到的 err 或者 ret 会扩散到后续的代码去,你总不能在所有的地方都准备好 panic 和 recover 吧?
那你现在明白为什么会不定期 crash 了没?