Go语言中对Panic的处理

https://github.com/golang/go/wiki/PanicAndRecover

Panic

panic和recover函数和其他编程语言中的try/catch很相似,panic会导致程序栈展开,recover可以停止这个过程。defer调用的函数在程序栈展开过程中仍然可以执行。如果在defer调用的函数中调用recover,程序栈会停止展开,recover则会返回一个interface{}类型的值,这个值就是被传给panic的值。运行时期也可能在一些极端情况下出现panic,比如数组或切片的index越界。如果panic导致程序栈展开并超出了当前执行的go程(例如main或者其他在go程中运行的函数没能成功恢复),整个程序会终止,panic无法从其他go程中recover

 

在代码包中的使用

习惯上,不允许panic()显式地跨越包的边界。告知调用者错误的情况应该通过返回error值。在同一包中,尤其是存在深度嵌套调用non-exported函数时,使用panic来指示错误情况可能很有用,也可以提高程序可读性,对于调用的函数,panic应该转换为error。以下是一个例子:

// A ParseError indicates an error in converting a word into an integer.
type ParseError struct {
	Index int    // The index into the space-separated list of words.
	Word  string // The word that generated the parse error.
	Error error  // The raw error that precipitated this error, if any.
}

// String returns a human-readable error message.
func (e *ParseError) String() string {
	return fmt.Sprintf("pkg: error parsing %q as int", e.Word)
}

// Parse parses the space-separated words in input as integers.
func Parse(input string) (numbers []int, err error) {
	defer func() {
		if r := recover(); r != nil {
			var ok bool
			err, ok = r.(error)
			if !ok {
				err = fmt.Errorf("pkg: %v", r)
			}
		}
	}()

	fields := strings.Fields(input)
	numbers = fields2numbers(fields)
	return
}

func fields2numbers(fields []string) (numbers []int) {
	if len(fields) == 0 {
		panic("no words to parse")
	}
	for idx, field := range fields {
		num, err := strconv.Atoi(field)
		if err != nil {
			panic(&ParseError{idx, field, err})
		}
		numbers = append(numbers, num)
	}
	return
}
func main() {
	var examples = []string{
		"1 2 3 4 5",
		"100 50 25 12.5 6.25",
		"2 + 2 = 4",
		"1st class",
		"",
	}

	for _, ex := range examples {
		fmt.Printf("Parsing %q:\n  ", ex)
		nums, err := Parse(ex)
		if err != nil {
			fmt.Println(err)
			continue
		}
		fmt.Println(nums)
	}
}

 

转载于:https://my.oschina.net/u/3705207/blog/1585728

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值