为什么错误消息不应该在Go中以标点符号结尾?
我有错误文本的问题。
如果我使用下面显示的错误消息,编辑器的 linter 会发出这样的警告:“错误字符串不应以标点符号或换行符结尾”:
return errors.New("Test!")
^
问题是:为什么我不应该使用标点符号?背后的真正原因是什么?
回答
错误可能会被封装在调用堆栈中,并且它们的消息可能会在打印之前被连接起来。如果添加标点符号,从语法的角度来看,最终结果可能会很奇怪。
正如评论中的链接所说:
错误字符串不应大写(除非以专有名词或首字母缩略词开头)或以 punctuation 结尾,因为它们通常在其他上下文之后打印。
例如,考虑以下程序:
func main() {
fmt.Println(foo()) // bar failed: baz failed!: some problem
}
func foo() error {
err := bar()
if err != nil {
return fmt.Errorf("%s: %w", "bar failed", err)
}
return nil
}
func bar() error {
err := baz()
if err != nil {
return fmt.Errorf("%s: %w", "baz failed!", err)
}
return nil
}
func baz() error {
return errors.New("some problem")
}
当然,这个例子是人为设计的,但关键是在现实世界的场景中,你不知道你的库——或者你的代码的用户——将如何格式化他们的错误。这个问题可能更容易用 error package 来演示"github.com/pkg/errors",其中每次调用都会在打印消息时Wrap产生一个冒号 ( :) 分隔符:
package main
import (
"github.com/pkg/errors"
"fmt"
)
func main() {
fmt.Println(errors.Wrap(errors.Wrap(errors.Wrap(errors.New("foo"), "bar"), "baz"), "quux"))
// quux: baz: bar: foo
}
游乐场:https : //play.golang.org/p/dxI2301IX1P