账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    golang异常处理,返回异常无法捕获
    44
    0

    为什么defer fun()中返回的error,调用的地方,获取到位nil?

    func call1(x string) (string, error) {  
       fmt.Println("into call1")  
       var reback string \= ""  
      
      canset := false  
     defer func() (string, error) {  
          i := recover()  
          if i != nil {  
             fmt.Println("异常信息捕获:", i, "反射到的y是否可以编辑?", canset)  
             j := fmt.Sprintf("%s", i)  
      
             //这里返回的异常,外层无法拦截到?  
      return "", errors.New("异常信息捕获:" \+ (j))  
          } else {  
             return reback, nil  
      }  
       }()  
       a := x  
     y := reflect.ValueOf(x)  
       canset \= y.CanSet()  
      
       y.SetString("10")  
       b := x  
      //报错了 reflect.flag.mustBeAssignable using unaddressable value  reback \= "反射修改前:" \+ a \+ "反射修改后:" \+ b  
      fmt.Println(reback)  
       return reback, nil  
    }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 薄う祭ぁ 普通会员 1楼

      在Go语言中,并没有传统的异常处理机制,如Java、Python等语言中的try-catch。Go语言采用的是通过返回错误(error)的方式来处理异常情况。

      例如:

      ```go func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil }

      func main() { result, err := divide(10, 2) if err != nil { // 捕获并处理错误 fmt.Println("Error occurred:", err) } else { fmt.Println("Result is", result) } } ```

      在上述代码中,divide函数在除数为零时返回一个非nil的error。在main函数中,通过检查返回值err是否为nil来判断是否发生错误,从而实现对“异常”的捕获和处理。

      因此,如果你遇到返回的异常无法捕获的情况,请检查:

      1. 调用函数时,是否正确接收并检查了error返回值。
      2. 返回错误的地方,是否确实返回了一个非nil的error对象。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部