社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
package main
import "fmt"
import "errors"
func main() {
//方法一 使用fmt包
var err1 = fmt.Errorf("%s", "this is normal err1")
fmt.Println("err1 = ", err1)
err2 := fmt.Errorf("%s", "this is normal err2")
fmt.Println("err2 = ", err2)
//方法二 使用errors包
err3 := errors.New("this is normal err3")
fmt.Println("err3 = ", err3)
}
输出:
package main
import "fmt"
import "errors"
func Mydiv(a, b int) (result int, err error) {
err = nil
if b == 0 {
err = errors.New("分母不能为0")
} else {
result = a / b
}
return
}
func main() {
result, err := Mydiv(2, 0)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("result = ", result)
}
}
输出:
当遇到不可恢复的错误状态时,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常。当某些不应该发生的场景发生时,我们就应该调用panic.一般而言,当panic异常发生时,程序会中断运行,并立即执行该goroutine(可以先理解成线程),在执行中被延迟的函数(defer机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。
不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。
【1】显式调用panic异常
package main import "fmt" func testa() { fmt.Println("aaa") } func testb() { //fmt.Println("bbb") //显示调用panic函数,导致程序中断 panic("this is a panic test") } func testc() { fmt.Println("ccc") } func main() { testa() testb() testc() }
输出:
可以看到testa执行完后,在执行testb的时候程序中断,并提示panic: this is a panic test
【2】数组越界引起panic
package main import "fmt" func testa() { fmt.Println("aaa") } func testb(x int) { var a [10]int a[x] = 666 //当x为20时,导致数组越界,系统自动调用panic,导致程序崩溃 } func testc() { fmt.Println("ccc") } func main() { testa() testb(20) testc() }
输出:
运行时panic异常一旦被引用就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。
不过,Go语言为我们提供了专用于“拦截”运行时panic的内建函数—recover。他可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。
注意:recover只有在defer调用的函数中有效。
如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。
应用:
package main import "fmt" func testa() { fmt.Println("aaa") } func testb(x int) { //设置recover defer func() { //recover() 可以打印panic的错误信息 if err := recover(); err != nil { fmt.Println(err) } }() var a [10]int a[x] = 666 } func testc() { fmt.Println("ccc") } func main() { testa() testb(2) testc() testb(20) }
输出:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!