錯(cuò)誤
package main
import (
"errors"
"fmt"
)
//43
func main() {
//f,err := os.Open("test.txt")
//if err != nil {
// // log.Fatal(err) //2020/03/11 10:27:38 open test.txt: The system cannot find the file specified.
// fmt.Println(err) //open test.txt: The system cannot find the file specified.
// return
//}
//fmt.Println(f.Name(),"打開文件成功")
/*
error:內(nèi)置得數(shù)據(jù)類型,內(nèi)置的接口
定義的方法:Error() string
使用go語(yǔ)言提供好的包:
errors包下的函數(shù):New(),創(chuàng)建一個(gè)error對(duì)象
fmt包下得Errorf()函數(shù):
func Error(format string,a ...interface{}) error
*/
err1 := errors.New("自己創(chuàng)建玩的...")
fmt.Println(err1) //自己創(chuàng)建玩的...
fmt.Printf("%T\n",err1) //*errors.errorString
//另一個(gè)創(chuàng)建error得方法
err2 := fmt.Errorf("錯(cuò)誤信息碼:%d",100)
fmt.Println(err2)
fmt.Errorf("%T\n",err2)
err3 := checkAge(-1)
if err3 != nil {
fmt.Println(err3)
return
}
fmt.Println("...........")
}
//設(shè)計(jì)一個(gè)函數(shù),驗(yàn)證年齡是否合法
func checkAge(age int) error {
if age < 0 {
return errors.New("年齡不合法")
}
fmt.Println("年齡是:",age)
return nil
}
錯(cuò)誤類型表示
package main
import (
"fmt"
"os"
)
//44
func main() {
/*
錯(cuò)誤類型表示
*/
f,err := os.Open("test.txt")
if err != nil {
fmt.Println(err)
if ins,ok := err.(*os.PathError);ok {
fmt.Println("1.0p:",ins.Op) //1.0p: open
fmt.Println("2.Path",ins.Path) //2.Path test.txt
fmt.Println("3.Err:",ins.Err) //3.Err: The system cannot find the file specified.
}
return
}
fmt.Println(f.Name(),"打開文件成功")
}
package main
import (
"fmt"
"net"
"path/filepath"
)
//45
func main() {
/*
錯(cuò)誤類型表示
*/
addr,err := net.LookupHost("www.baidu.com")
fmt.Println(err) //<nil>
if ins,ok := err.(*net.DNSError);ok {
if ins.Timeout() {
fmt.Println("操作超時(shí)")
} else if ins.Temporary() {
fmt.Println("臨時(shí)性錯(cuò)誤")
} else {
fmt.Println("通常錯(cuò)誤")
}
}
fmt.Println(addr) //[39.156.66.18 39.156.66.14]
files,err := filepath.Glob("[")
if err != nil && err == filepath.ErrBadPattern {
fmt.Println(err) //syntax error in pattern 提供的解析模式錯(cuò)誤
return
}
fmt.Println("files:",files)
}
自定義error
package main
import (
"fmt"
"math"
)
//46
func main() {
/*
自定義error
*/
radius := -3.0
area,err := circleArea(radius)
if err!= nil {
fmt.Println(err)
// 使用斷言獲得非法數(shù)據(jù)
if err,ok := err.(*areaError);ok {
fmt.Printf("半徑是:%.2f\n",err.radius)
}
return
}
fmt.Println("圓形的半徑是:",area)
}
//定義一個(gè)結(jié)構(gòu)體,表示錯(cuò)誤得類型
type areaError struct {
msg string
radius float64
}
//2. 實(shí)現(xiàn)error接口,就是實(shí)現(xiàn)Error()方法
func (e *areaError) Error() string {
return fmt.Sprintf("error:半徑,&.2f,%s",e.radius,e.msg)
}
func circleArea(radius float64)(float64,error) {
if radius < 0 {
return 0,&areaError{"半徑非法",radius}
}
return math.Pi * radius * radius,nil
}
panic和recover
package main
import "fmt"
//47
func main() {
/*
panic 和 recover
*/
funA()
defer myprint("defer main3......")
funB()
defer myprint("defer main4......")
fmt.Println("main over...")
}
func myprint(s string) {
fmt.Println(s)
}
func funA() {
fmt.Println("我是第一個(gè)函數(shù)funA")
}
func funB() { //外圍函數(shù)
defer func() {
if msg := recover();msg != nil {
fmt.Println(msg,"程序恢復(fù)了")
}
}()
fmt.Println("我是函數(shù)funB")
defer myprint("defer funB()1.....")
for i:=1;i<=10;i++ {
fmt.Println("i:",i)
//讓程序中斷
if i == 5 {
panic("funB函數(shù),恐慌")
}
}
//當(dāng)外圍函數(shù)代碼中發(fā)生了恐慌,只有其中所有的defer得函數(shù)全部執(zhí)行完畢后,才會(huì)被傳到函數(shù)的調(diào)用出
defer myprint("defer funB()2.....")
}