为什么错误消息不应该在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


以上是为什么错误消息不应该在Go中以标点符号结尾?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>