Learn And Life.

go defer and panic

go编程异常的处理是个很热的话题,不像java,可以使用try…catch来捕获异常,而是直接产生panic,中断程序的执行,
这样带来的一个问题就是,如果我在同一个目录下面,有几个协同工作的job,但是其中一个发生了panic,最终导致所有的job都会产生中断执行,
这明显从可靠性来说是很不合理的设计,因此go从设计上,强烈建议不要使用panic,除非你知道你自己是在做什么,
但是panic是避免不了的,那如何来处理panic的行为呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
func test(){
status := true
defer go func(){
if status {
println("panic happend")
  }
}()
panic("panic")
status = false
}
func main(){
test()
}

从上面的代码可以看出,如果status等于true,说明是panic发生了,反之,说明没有发生panic,这样就可以实现一些收尾的工作,
注意panic是不能跟defer交换的,那样defer就不会执行.