error 接口
type error interface(){ Error() string }
在Go语言中处理错误的方式通常是将返回的错误与nil进行比较。nil值表示没有发生错误,而非nil值表示出现错误。如果不是nil,需打印输出错误。
package main import ( "errors" "fmt" "math" ) // 异常处理机制 error 接口 func main() { num,err:=Sqrt(-100) if err!=nil{ fmt.Println(err) }else{ fmt.Println(num) } } // 定义平法根,算术运算 func Sqrt(num float64)(float64,error){ if num>0 { return math.Sqrt(num),nil }else { return 0,errors.New("负数不可以求算术平方根") } }
自定义接口类型:
step1: 定义一个结构体,表示自定义错误的类型。
step2:让自定义错误类型实现error接口:Error() string。
step3:定义一个返回error的函数。根据程序实际功能而定。
package main import ( "fmt" "strings" ) //step 1:自定义错误结构体 type MyError struct { err string } // step2:让自定义错误类型实现error接口:Error() string func (e MyError) Error() string{ return e.err } // step3: 定义一个返回error的方法 func test(str string) (string,error){ if strings.EqualFold(str,"err"){ return "",MyError{"传入的字符串不可以是err"} } return str,nil } func main() { str,err:=test("err") if err!=nil { fmt.Println(err) }else { fmt.Println(str) } }
defer函数
关键字defer用于延迟一个函数或者方法的执行。defer语句只能出现在函数或方法的内部。
在函数中可以添加多个defer语句。如果有很多调用defer,当函数执行到最后时,这些defer语句会按照逆序执行(报错的时候也会执行),最后该函数返回。
package main import "fmt" //defer 推迟方法的执行 func main() { defer A() B() defer C() fmt.Println("end----------") } func A() { fmt.Println("A-----------") } func B() { fmt.Println("B-----------") } func C(){ fmt.Println("C-----------") }
延迟函数的参数在执行延迟语句时被执行,而不是在执行实际的函数调用时执行。
当一个函数有多个延迟调用时,它们被添加到一个堆栈中,并按后进先出(Last In First Out,LIFO)的顺序执行.
panic和recover机制
不应通过调用panic()函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时调用panic()
Go语言为开发者提供了专用于“拦截”运行时panic的内建函数recover()。recover()可以让进入恐慌流程的Goroutine恢复过来并重新获得流程控制权。
recover() 只在推迟函数种有效。