Error接口
在Golang中,所有的错误都应该实现内建的error接口。这个接口具有一个Error方法,返回一个描述错误信息的字符串。以下是一个简单的例子:```go func divide(x, y int) (int, error) { if y == 0 { return 0, errors.New("cannot divide by zero") } return x / y, nil } ```
在这个例子中,如果尝试除以0,则会返回一个自定义的错误信息。通过使用errors.New函数创建一个新的错误。自定义错误类型
自定义错误类型是一种更高级别的错误处理方式,它可以提供更多的信息和上下文。在Golang中,我们可以通过创建一个实现了error接口的新类型来定义自己的错误类型。以下是一个示例:```go type CustomError struct { Msg string FilePath string Line int } func (e CustomError) Error() string { return fmt.Sprintf("CustomError: %s\nFile: %s\nLine: %d", e.Msg, e.FilePath, e.Line) } func processFile(filePath string) error { // some logic here if err := someOperation(); err != nil { return CustomError{Msg: "failed to perform some operation", FilePath: filePath} } // more logic here return nil } ```
在这个例子中,我们创建了一个名为CustomError的新类型。它有三个字段:Msg、FilePath和Line,分别用于存储错误消息、文件路径和发生错误的行号。通过实现Error()方法,我们可以自定义错误的字符串表示形式。错误处理模式
下面介绍几种常见的错误处理模式:错误传播
错误传播是指将函数内部遇到的错误传递给调用方处理。在Golang中,可以通过返回错误值来实现错误传播。以下是一个示例:```go func main() { if err := divide(10, 0); err != nil { fmt.Println(err.Error()) } } func divide(x, y int) error { if y == 0 { return errors.New("cannot divide by zero") } return nil } ```
在这个例子中,如果除以0,则divide函数返回一个错误。调用方可以根据返回的错误值进行相应的处理。错误处理链
错误处理链是一种高级的错误处理模式,它允许在每个环节对错误进行处理和转换。这主要通过defer和recover函数实现。以下是一个示例:```go func main() { if err := processFile("example.txt"); err != nil { fmt.Println(err.Error()) } } func processFile(filePath string) (err error) { defer func() { if p := recover(); p != nil { err = fmt.Errorf("panic recovered: %v", p) } }() // some logic here if err := someOperation(); err != nil { panic(err) } // more logic here return nil } ```
在这个例子中,我们使用defer和recover函数,将panic转换为一个普通的错误。这样可以避免程序崩溃,并且错误可以被正确处理。