为了账号安全,请及时绑定邮箱和手机立即绑定

在Go中进行恐慌恢复与尝试其他语言的捕获

在Go中进行恐慌恢复与尝试其他语言的捕获

Go
绝地无双 2021-04-14 16:14:11
我刚刚阅读了有关Go中Panic / Recover的帖子,但尚不清楚它与其他主流语言中的try / catch有何不同。
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

我一直在思考这个问题,以寻求最佳答案。仅仅指出恐慌/恢复的惯用用法,而不是try / catch&| 其他语言中的例外或这些成语背后的概念(可以概括为“例外应仅在真正特殊的情况下发生”)

但是,它们之间的实际区别是什么?我会尽力总结一下。

try / catch块相比,主要区别之一是控制流的方式。在典型的try / catch场景中,除非传播错误,否则catch块之后的代码将运行。对于panic / recover并非如此。紧急情况会中止当前函数,并开始展开堆栈,并在遇到延迟函数时运行延迟函数(唯一的地方recover会执行任何操作)。

真的,我会更进一步:恐慌/恢复几乎没有像try / catch那样的意思,因为try和catch是(或至少表现得像)控制结构,而panic / recover不是。

这实际上源于以下事实:恢复是围绕延迟机制构建的,据我所知,延迟机制在Go中是一个非常独特的概念。

当然还有更多,如果我能更好地激发自己的想法,我会添加更多内容。


查看完整回答
反对 回复 2021-04-26
?
阿晨1998

TA贡献2037条经验 获得超6个赞

紧急/恢复范围内的功能。这就像说您在每个函数中只允许一个try / catch块,而try必须覆盖整个函数。这使得以Java / python / c#等使用异常的相同方式使用Panic / Recover非常令人讨厌。这是故意的。这也鼓励人们以设计使用的方式使用Panic / Recover。您应该从panic()中恢复(),然后将错误值返回给调用方。


查看完整回答
反对 回复 2021-04-26
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我认为我们都同意panicthrowrecovercatchdeferfinally

最大的区别似乎recover就在里面defer。回到传统术语,它使您可以准确地决定要在哪一点上finally打扰catch任何事情,或者根本不打扰。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信