去错误处理技术

gmo*_*ore 106 go

我刚刚开始使用Go.我的代码开始有很多这样的:

   if err != nil {
      //handle err
   }
Run Code Online (Sandbox Code Playgroud)

或这个

  if err := rows.Scan(&some_column); err != nil {
      //handle err
  }
Run Code Online (Sandbox Code Playgroud)

在Go中检查和处理错误是否有一些很好的习语/策略/最佳实践?

编辑澄清:我不是在追逐或暗示Go团队想出更好的东西.我问的是我做得对,还是我错过了社区提出的一些技巧.谢谢大家.

zzz*_*zzz 60

您的代码是惯用的,我认为这是最佳实践.有些人肯定不同意,但我认为这是Golang标准库中看到的风格.换句话说,Go作者以这种方式编写错误处理.

  • "Go作者以这种方式编写错误处理." 听起来不错. (12认同)
  • 让我失望的是每个函数调用使用相同的模式.这使得代码在某些地方相当嘈杂,并且只是为了简化代码而尖叫出来以简化代码而不会丢失任何信息,这本质上是简洁的定义(我认为这是一个优于冗长的属性,但这可以说是一个有争议的点).原则是合理的,但语法留下了很多不足之处恕我直言.但是抱怨是禁止的,所以我现在就喝我的kool-aid ;-) (4认同)
  • @jnml以这种方式处理错误是语言设计的问题,这是一个备受争议的话题.幸运的是有几十种语言可供选择. (2认同)

Mic*_*uff 30

在提出这个问题六个月之后,Rob Pike写了一篇名为Errors are Values的博客文章.

在那里,他认为你不需要以OP提供的方式编程,并提到标准库中的几个地方,他们使用不同的模式.

当然,涉及错误值的常见语句是测试它是否为nil,但是还有无数其他可以用错误值做的事情,并且应用其他一些东西可以使你的程序更好,从而消除了大量的样板如果使用rote if语句检查每个错误,则会出现这种情况.

...

使用该语言可以简化错误处理.

但请记住:无论你做什么,总是检查你的错误!

这是一个很好的阅读.

  • 派克:"但请记住:无论你做什么,都要检查你的错误!" - 这是80年代.错误可能发生在任何地方,停止给程序员带来负担,并为Pete的利益采用例外. (2认同)

Int*_*net 22

我同意jnml的答案,他们都是惯用代码,并添加以下内容:

你的第一个例子:

if err != nil {
      //handle err
}
Run Code Online (Sandbox Code Playgroud)

在处理多个返回值时更加惯用.例如:

val, err := someFunc()
if err != nil {
      //handle err
}
//do stuff with val
Run Code Online (Sandbox Code Playgroud)

你的第二个例子是只处理err价值的好速记.如果函数只返回一个error,或者如果你故意忽略除了之外的返回值,则适用error.例如,这有时与返回写入的字节数(有时是不必要的信息)的函数ReaderWriter函数一起使用,int并且error:

if _, err := f.Read(file); err != nil {
      //handle err
}
//do stuff with f
Run Code Online (Sandbox Code Playgroud)

第二种形式称为使用if初始化语句.

所以关于最佳实践,据我所知(除了使用"errors"包在你需要时创建新的错误)你已经涵盖了几乎所有你需要知道的Go中的错误!

编辑:如果你发现你真的不能没有例外,你可以模仿他们defer,panic&recover.