Go代码如何规划异常(恐慌)?

时间:2017-04-28 11:57:31

标签: go

我不知道去吧。我正在通过文档来了解该语言并且遇到了Defer Panic Recover功能。

恐慌似乎像例外一样起作用。但是我无法找到我的代码如何防范这些异常,这些异常可以被我所调用的层下面的层抛出。 Java检查了异常。 Go有类似的东西吗?

这是如何工作的?

编辑:似乎有两种方法可以考虑这个

  1. 恐慌是非常罕见的,应该允许它按照here
  2. 所述杀死程序
  3. 恐慌可用于常规代码流 - 作为延迟恐慌的示例,如here所述,其描述了如何将其用于格式错误的输入。
  4. 我的问题涉及在像2这样的情况下使用恐慌,这似乎很容易实现。

1 个答案:

答案 0 :(得分:0)

当然,您可以使用恐慌来控制程序的常规流程,但我认为更惯用的方法是在这种情况下(例如用户输入格式错误的情况下)向调用者返回错误。

恐慌通常用于特殊情况,暗示程序中存在某种错误。如果出现问题,您可以自己调用恐慌,但在nil指针取消引用,超出数组访问和其他类似情况的情况下,它也会自动调用。通常这样的事情会导致程序崩溃,默认情况下这样做,但如果你的程序是某种服务,你可能不希望整个程序崩溃,你只是想让它停止它在做什么时它遇到了崩溃并恢复了正常状态。

以Web服务器为例,如果由于某些错误导致某个奇怪的请求导致越界数组访问。您不希望整个服务器崩溃,而是希望它退出该请求的处理函数,但继续侦听新请求。在你的例子2中很好地描述了这样做的方法。所以你在你想要恐慌停止的地方推迟一个recover()函数。如果恢复返回错误,您知道您的程序正在崩溃。然后,您可以进行一些日志记录,也可以发送电子邮件给自己说出有问题等等,然后继续正常的程序流程。但是,如果您有一些验证功能,发现请求有问题,您可能不希望它发生恐慌。相反,您希望它返回一个错误,调用者(请求处理程序)然后可以用400错误请求回答请求,然后正常退出处理程序。