Go Wiki:错误
通过将 error
作为函数的附加返回值来指示错误。nil
值表示没有错误。
可以通过调用 Error
(其唯一的方法)将 error
转换为字符串。您可以通过调用 errors.New
if failure {
return errors.New("inverse tachyon pulse failed")
}
或使用 fmt.Errorf
从字符串创建错误
if failure {
return fmt.Errorf("inverse tachyon pulse failed")
}
错误字符串不应以大写字母开头,因为它们通常会在打印前加上前缀
err := TryInverseTachyonPulse()
if err != nil {
fmt.Printf("failed to solve problem: %s\n", err)
}
如果您希望调用代码能够处理错误,则可以通过返回特殊值或新类型来区分错误类别。您只需要区分调用代码可以预期以这种方式处理的差异,因为字符串允许您传达错误的详细信息。
io.EOF
是一个特殊值,表示流的结尾。您可以直接将错误值与 io.EOF 进行比较。
如果您想使用错误携带额外数据,可以使用一个新类型
type ParseError struct {
Line, Col int
}
func (p ParseError) Error() string {
return fmt.Sprintf("parse error on line %d, column %d", p.Line, p.Col)
}
如果您想创建一个常量字符串错误,可以使用一个命名类型字符串
type errorConst string
const ErrTooManyErrors errorConst = "too many errors found."
func (e errorConst) Error() string {
return string(e)
}
调用代码将使用类型转换来测试特殊类型的error
switch err := err.(type) {
case ParseError:
PrintParseError(err)
}
命名
错误类型以"Error"
结尾,错误变量以"Err"
或"err"
开头
package somepkg
// ParseError is type of error returned when there's a parsing problem.
type ParseError struct {
Line, Col int
}
var ErrBadAction = errors.New("somepkg: a bad action was performed")
// -----
package foo
func foo() {
res, err := somepkgAction()
if err != nil {
if err == somepkg.ErrBadAction {
}
if pe, ok := err.(*somepkg.ParseError); ok {
line, col := pe.Line, pe.Col
// ....
}
}
}
参考
- 错误(规范):https://golang.ac.cn/ref/spec#Errors
- 包
errors
:https://pkg.go.dev/errors/ - 类型转换:https://golang.ac.cn/ref/spec#TypeSwitchStmt
此内容是Go Wiki的一部分。