Golang 处理错误,panic defer PK try catch 机制
go 语言使用 panic defer 机制处理错误,但可能你喜欢使用 try catch 机制。因此,需知道两种机制之间的关系。演示代码如下:
package main
import (
"errors"
"fmt"
)
var (
internalError = errors.New("Don't need send out")
KnowError = errors.New("Excepted error!")
)
func main() {
fmt.Println("Hello, 世界")
//use `func() {}()` wrap try catch final blocks
v, e := func() (v int, e error) {
defer func() { //just like catch block
if r := recover(); r != nil {
e, _ = r.(error)
switch e {
case internalError:
// do something here, such as:
v += 5
e = nil
case KnowError:
fmt.Println(KnowError)
default:
panic(r)
}
}
}()
defer func() {}() //just like finally block
//try bock
v = 10
//panic(internalError)
//panic(KnowError)
//panic(errors.New("? Error"))
v += 10
return
}()
fmt.Println("output = ",v, e)
}
- 用一个内部匿名函数包装 try块。如果函数有结果返回,务必使用预定义返回变量方式!
- 匿名函数内先 defer 一个函数处理 catch,使用上述程序函数模板
- 匿名函数内先 defer 一个函数处理 finally
try 块没有错误输出:
Hello, 世界
output = 20 <nil>
try 块出现 internalError 错误,输出:
Hello, 世界
output = 15 <nil>
try 块出现 KnowError 错误,输出:
Hello, 世界
output = 10 Excepted error!
try 块出现 未知 错误,输出:
Hello, 世界
panic: ? Error [recovered]
panic: ? Error
goroutine 1 [running]:
main.main.func1.1(0xc42004def8, 0xc42004def0)
/tmp/compile62.go:29 +0x1c8
... ...
结论:go 函数太强大,能自由完成各种复杂错误处理要求,但语法就比使用 try 机制的隐晦一些!