恐慌与断言之间有什么区别?

时间:2010-01-29 21:43:19

标签: go

  

Go doesn't provide assertions. They are undeniably convenient, but our experience has been that programmers use them as a crutch to avoid thinking about proper error handling and reporting.

然而它有print and println

  像打印一样恐慌,打印后中止执行   panicln like println,打印后中止执行

与断言相同吗?为什么他们会声称上述但却恐慌?我可以看到它导致相同的问题,但添加一个错误消息到它的结尾,很容易被滥用。我错过了什么吗?

3 个答案:

答案 0 :(得分:16)

不,不是。恐慌就像“写然后中止”,而断言就像“测试,如果它是假的,写然后中止”。无论如何,他们无法阻止你做出类似断言的陈述。

答案 1 :(得分:2)

除了显而易见的,panicassert时没有检查任何内容,在Go中你可以使用机制进行错误处理,即使发生恐慌也是如此。

如果一个包认为发生了无法从中恢复的事情恐慌。

但是,包用户,调用者(父级)可能要么检查或记录恐慌然后继续恐慌,要么抓住它以正确处理案例(例如,再试一次,或者再使用不同的包/功能)。

此外,断言中止不会调用析构函数或任何东西。虽然Go中的恐慌仍然会调用你defer执行的函数,所以一切都被清除了。

因此,正如您所看到的,与断言相比,恐慌将允许各种清理任务。这就是你给出的引用指向的内容。

有关延迟,恐慌和恢复的详细信息,请参阅the official blog post on them

答案 2 :(得分:1)

例如,在C中,assert()仅在调试模式下中止执行。