发布时间:2024-12-23 02:34:02
```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函数创建一个新的错误。```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()方法,我们可以自定义错误的字符串表示形式。```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函数返回一个错误。调用方可以根据返回的错误值进行相应的处理。```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转换为一个普通的错误。这样可以避免程序崩溃,并且错误可以被正确处理。