package main
import "fmt"
func main(){
defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
fmt.Println("c")
//if err:=recover();err!=nil{
// fmt.Println(err) // 这里的err其实就是panic传入的内容,55
//}
fmt.Println("d")
}()
f()
fmt.Printf("f -- main函数执行结束")
}
func f(){
fmt.Println("a")
panic("抛出异常的信息")
fmt.Println("b")
}
//执行结果
a
c
d
panic: 抛出异常的信息
goroutine 1 [running]:
main.f()
G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:19 +0x80
main.main()
G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:13 +0x45
Process finished with exit code 2
复制代码
2.使用recover--exitCode==0
package main
import "fmt"
func main(){
defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
fmt.Println("c")
if err:=recover();err!=nil{
fmt.Println(err) // 这里的err其实就是panic传入的内容,55
}
fmt.Println("d")
}()
f()
fmt.Printf("f -- main函数执行结束")
}
func f(){
fmt.Println("a")
panic("抛出异常的信息")
fmt.Println("b")
}
//执行结果
a
c
抛出异常的信息
d
Process finished with exit code 0
复制代码
3. 无revocer-panic会传递导致进程终止
package main
import (
"os""fmt""time"
)
func main() {
defer fmt.Println("defer main") // will this be printed when panic?
var user = os.Getenv("USER_")
go func() {
defer fmt.Println("defer caller")
func() {
defer func() {
fmt.Println("defer here")
}()
if user == "" {
panic("should set user env.")
}
}()
}()
time.Sleep(1 * time.Second)
fmt.Printf("get result %d\r\n", result)
}
//执行结果
defer here
defer caller
panic: should set user env.
goroutine 18 [running]:
main.main.func1.1(0x0, 0x0)
G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:20 +0x86
main.main.func1(0x0, 0x0)
G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:22 +0x98
created by main.main
G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:12 +0xb1
Process finished with exit code 2
复制代码
4. recover--只终止异常的gouroutine try-catch
package main
import (
"fmt""os""time"
)
func main() {
defer fmt.Println("defer main") // will this be called when panic?
var user = os.Getenv("USER_")
go func() {
defer func() {
fmt.Println("defer caller")
if err := recover(); err != nil {
fmt.Println("recover success.")
}
}()
func() {
defer func() {
fmt.Println("defer here")
}()
if user == "" {
panic("should set user env.")
}
fmt.Println("after panic")
}()
}()
time.Sleep(1 * time.Second)
fmt.Printf("get result %d\r\n")
}
//执行结果
defer here
defer caller
recover success.
get result %!d(MISSING)
defer main
Process finished with exit code 0
复制代码