错误和异常是两个不同的概念
错误一般是导致代码直接运行不过
异常:一般指对函数逻辑有影响
如下代码:
package main
import (
"fmt"
)
func div(a, b int) (int, error) {
if b == 0 {
panic("被除数不能为0")
}
return a / b, nil
}
func main() {
//错误是遇到可能出现的情况,这些情况会导致你的代码出现问题,参数检查,数据库访问不了
//data := 12
//strconv.Itoa(data) //go认为这个Itoa的函数不可能出错 内部代码出错这个时候应该抛出异常
//i, err := strconv.Atoi("12") //Atoi认为这个函数会出现一些预知的错误情况
//if err != nil {
// //错误
//}
defer func() {
err := recover()
if err != nil {
fmt.Println("遗产被捕获到")
}
}()
a := 12
b := 0
fmt.Println(div(a, b))
//异常 go语言中如何抛出异常如何捕捉异常
}
关于协程中出现的panic与recove,子协程中无法拿到父协程中的异常信息
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
a := 10
b := 10
fmt.Println(a / b)
panic("error")
w.Write([]byte("hello world"))
})
http.ListenAndServe("127.0.0.1:8080", http.Handler(nil))
//panic会引起主线程的挂掉,同时会引起其他协程挂掉
//为什么panic不会报错呢,在父协程中无法捕获子协程中出现的异常
}
总结:go语言认为错误就要处理。