最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

golang中用recover捕获异常

Golang 549浏览 0评论

像php,java,nodejs都可以用try catch来捕获异常,golang也可以用recover来实现类似的功能,这边用一个简单的例子除数为0来看看用法吧,重点是理解recover原理。

package main

import (
	"fmt"
	"time"
)

func main() {
	i := 10000
	for j := 0; j < 3; j++ {
		// 使用多协程处理,其中可以预见的是除数为0会抛出异常
		go divide(i, j)
	}

	// 为了保证前面线程运行完,这里休眠一下
	for {
		time.Sleep(1 * time.Second)
	}
}

func divide(i, j int) {
	// 定义recover方法,在后面程序出现异常的时候就会捕获
	defer func() {
		if r := recover(); r != nil {
			// 这里可以对异常进行一些处理和捕获
			fmt.Println("Recovered:", r)
		}
	}()

	fmt.Println(i / j)
}

运行:

go run recover.go 
Recovered: runtime error: integer divide by zero
10000
5000

可以看到即使有其中一个协程出现了异常,但是不会导致整个程序退出,另外两个协程能够顺利运行,这个功能其实非常常用,基本每个项目都会使用到,最常见的就是net/http包,因为有捕获异常,所以不会因为单个用户访问出现异常而导致整个服务中断。

转载请注明:快乐编程 » golang中用recover捕获异常

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址