Error:
异常就是程序出现了不正常的情况,会导致程序非正常停止,而异常处理就是针对非正常停止的情况,给出异常时的处理方式。语法错误不算异常体系中
error是一个接口,作用是返回程序异常的信息,errors实现了error
type error interface {
Error() string
}
可以通过实现接口自定义异常信息,如果将error作为返回值的话,要放在返回值列表的最后
type ErrorTest struct{}
// 实现error接口
func (error *ErrorTest) Error() (str string) {
str = "我是自定义的异常信息"
return
}
func main() {
errorTest := ErrorTest{}
fmt.Println(errorTest.Error())
}
使用errors.New()和e也可定义异常信息
func main() {
err := errors.New("我是errors.New定义的异常信息")
fmt.Println(err)
err2 := fmt.Errorf("我是fmt.Errorf定义的异常信息")
fmt.Println(err2)
}
————————————————————————————————分割线——————————————————————————————————
func TestError(num1, num2 int) (result int, err error) {
if num2 == 0 {
err = errors.New("分母不能为0")
} else {
result = num1 / num2
}
return
}
func main() {
num, err := TestError(1, 0)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(num)
}
}
panic:
panic:
终止程序,会立即宕机,宕机前会调用panic之前的defer,当程序遇到比较严重的异常时系统内部也会调用panic,例如数组越界
// panic参数可以是任何类型
type any = interface{}
func panic(v any)
演示:
func main() {
panic("我挂了")
fmt.Println("会走这一步吗") // 不会执行,编译器也会提示这是一个永远不会执行的代码
}
recover:
recover:
拦截panic异常信息,使程序正常执行下去,但是recover不可以直接调用,只有在defer调用的函数中有效,如果是放在循环中了,连续调用panic,仅最后一个会被recover捕耕
隐藏异常信息
func main() {
defer func() {
if r := recover(); r != nil {}
}()
panic("立即宕机")
}
recover的返回值就是异常信息
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
panic("立即宕机")
}