在 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,并打印出错误信息。