在 Go 中,没有异常的概念,但可以通过 panic 和 recover 来实现类似异常的处理。当发生 panic 的时候,会立即终止程序并打印出错误信息,但是通过 recover 可以在 defer 中捕获到 panic,从而实现类似异常处理的功能。
如果需要定义自己的错误类型,可以通过实现 error 接口来实现。error 接口定义如下:
type error interface {
Error() string
}
其中 Error 方法返回一个字符串,描述错误的信息。
例如,我们可以定义一个 DivideError 类型来处理除以零的错误:
type DivideError struct {
dividend int
divisor int
}
func (de *DivideError) Error() string {
return fmt.Sprintf("division by zero, dividend=%d, divisor=%d", de.dividend, de.divisor)
}
然后,在处理除以零的时候,可以使用 panic 将 DivideError 抛出,最后通过 recover 将错误信息打印出来:
func divide(dividend int, divisor int) (int, error) {
if divisor == 0 {
err := &DivideError{dividend, divisor}
panic(err)
}
return dividend / divisor, nil
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recover from panic:", r)
}
}()
_, err := divide(10, 0)
if err != nil {
fmt.Println(err)
}
}
这里的 divide 函数会在除数为零的情况下抛出 DivideError,然后在 main 函数中通过 recover 来捕获 panic,并打印出错误信息。