[golang] recover 处理不了 for 循环中的异常
clq
浏览(567) -
2019-01-12 15:20:43 发表
编辑
关键字: golang_bug
[2019-01-12 15:44:56 最后更新]
[golang] recover 处理不了 for 循环中的异常
func main(){
//defer PrintError("hmysql.PrintError");
for ;; {
defer PrintError("hmysql.PrintError"); //很显然,处理不了 for 循环,也就是说只能从函数中恢复,是不能从 for 循环中恢复的,所以不能中断的循环只能写成循环
//没法用 recover() 保护
err := 1;
panic(err) //相当于抛出一个异常,没有这个代码的话就不知道是什么错误了
fmt.Println("1");
}
//fmt.Println("ccc");
}//
func PrintError(funcName string){ // 必须要先声明defer,否则不能捕获到panic异常
//fmt.Println("c")
if err:=recover();err!=nil{
fmt.Print("err:[" + funcName + "]");
fmt.Println(err) // 这里的err其实就是panic传入的内容,55
}
//fmt.Println("d")
}//
clq
2019-01-12 15:44:56 发表
编辑
发现可以使用匿名函数来实现捕获 for 中的异常,同时函数体中的变量照样可以在匿名函数中使用!
例如
msg := "aaa";
for ;; {
func (){
defer PrintError("main_server_log() for")
//defer PrintError("hmysql.PrintError"); //很显然,处理不了 for 循环,也就是说只能从函数中恢复,是不能从 for 循环中恢复的,所以不能中断的循环只能写成循环
//没法用 recover() 保护
time.Sleep(time.Duration(3)*time.Second);
fmt.Println(msg); //匿名函数体外的变量一样能用
err := 1;
panic(err) //相当于抛出一个异常,没有这个代码的话就不知道是什么错误了
}(); //加上匿名函数结构即可,并且匿名函数照样可以使用函数体中的变量
fmt.Println("1");
}
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.