第十九篇:go协程练习: 抓取网页出现异常处理、panic、defer入门

:golang中抛出异常

 

 (2)如何做到抛出panic异常以后,后面的代码可以继续执行

  defer关键字:这时我们就要用defer 定义。 这很类似finally、也好比是析构函数。

 

 

 (3)defer函数可以指定多个,后进先出,延迟执行,常用于销毁资源、释放句柄等

 

 

(4) :如果是在有返回值的函数中return defer的运行 顺序是怎么样的尼?

a:

 

b:

 

 

 

 

 

 

 总结带初始化返回值的defer:

 

(5) main函数中捕获异常(这里依然要借助defer)

 

 

 (6):看实例代码

 

注意点:

 

 

 改造后的正确完整代码:

func main(){
	url:="https://news.cnblogs.com/n/page/%d/"
	c:=make(chan map[int][]byte)
	for i:=1;i<=3;i++{
		go func(index int) {
			defer func() {
				if err:=recover();err!=nil{
					fmt.Println(err)
				}
				if index==3{
					close(c)
				}
			}()
			url:=fmt.Sprintf(url,index)
			res,_:=http.Get(url)
			cnt,_:=ioutil.ReadAll(res.Body)
			if index==3 {
				test()
			}
			c<- map[int][]byte{index:cnt}
		}(i)
	}
	for getCnt:=range c{
		for k,v:=range getCnt{
			ioutil.WriteFile(fmt.Sprintf("../files/%d",k),v,777)
		}
	}
}

 

posted @ 2020-06-11 14:42  痞子胥  阅读(544)  评论(0)    收藏  举报