package main
import (
"errors"
"fmt"
)
func main() {
// 调用一个会返回错误的方法,判断err是否为空,非空则输出错误
if err := BadFunc(); err != nil {
fmt.Println(err)
} else {
fmt.Println("everything is fine")
}
}
func BadFunc() error {
// 通过errors.New()方法创建并返回一个错误
return errors.New("a bad error")
}
package main
import (
"fmt"
)
// 定义一个自定义错误结构
type MyErr struct{}
// 实现error接口的Error()方法
func (e MyErr) Error() string {
return "Sorry, this is my fault."
}
func main() {
// 定义一个实现error接口的变量err
var err error
// 为变量初始化并赋值为自定义错误
err = MyErr{}
// fmt方法中会判断变量是否实现了Error接口,如果实现的话会输出Error()方法的内容
fmt.Println(err)
}
package main
import "fmt"g
type NotFoundError struct{}
func (e NotFoundError) Error() string {
return "not found"
}
type PermissionDeniedError struct{}
func (e PermissionDeniedError) Error() string {
return "permission denied"
}
func main() {
var err error
err = NotFoundError{}
fmt.Println(err)
// 可以转换,且推断为相同类型
err1, ok1 := err.(NotFoundError)
fmt.Println(err1, ok1)
// 可以转换,但推断为不同类型
err2, ok2 := err.(PermissionDeniedError)
fmt.Println(err2, ok2)
}
not found
not found true
permission denied false
package main
func main() {
panic("oh!no!!!")
}
panic: oh!no!!!
goroutine 1 [running]:
main.main()
/tmp/sandbox037140472/prog.go:4 +0x40
package main
import (
"fmt"
)
func main() {
// 在main方法执行的末尾执行
defer func() {
// 拦截panic错误并将错误赋值给e
e := recover()
// 通过类型断言e是否实现了error接口,分别输出错误
if err, ok := e.(error); ok {
fmt.Println(err)
} else {
fmt.Println(e)
}
}()
// 引发一个panic错误
panic("oh!no!!!")
}