像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捕获异常