登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [golang] recover 处理不了 for 循环中的异常     [回主站]     [分站链接]
[golang] recover 处理不了 for 循环中的异常
clq
浏览(354) - 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");
    }    




总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录
golang的坑 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1