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)
}

  1. 用一个内部匿名函数包装 try块。如果函数有结果返回,务必使用预定义返回变量方式!
  2. 匿名函数内先 defer 一个函数处理 catch,使用上述程序函数模板
  3. 匿名函数内先 defer 一个函数处理 finally

try 块没有错误输出:

Hello, 世界
output =  20 

try 块出现 internalError 错误,输出:

Hello, 世界
output =  15 

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 机制的隐晦一些!

你可能感兴趣的:(golang)