全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 868|回复: 4

[Windows VPS] Go语言关于pkg/errors求助

[复制链接]
发表于 2021-3-24 21:23:53 | 显示全部楼层 |阅读模式
本帖最后由 CodyDoby 于 2021-3-24 21:25 编辑

不懂Go语言,照葫芦画瓢想搞个错误处理,结果蒙圈了各种报错,求帮看看...

报错:
  1.    
  2. • building binaries
  3. • building                  binary=/home/runner/work/gclone/gclone/dist/gclone_windows_amd64/gclone.exe
  4. • building                  binary=/home/runner/work/gclone/gclone/dist/gclone_linux_amd64/gclone
  5. • building                  binary=/home/runner/work/gclone/gclone/dist/gclone_linux_386/gclone
  6. • building                  binary=/home/runner/work/gclone/gclone/dist/gclone_windows_386/gclone.exe
  7. ⨯ release failed after 171.47s error=failed to build for linux_amd64: # github.com/donwa/gclone/backend/drive
  8. Error: backend/drive/drive.go:643:22: err.msg undefined (type error has no field or method msg)

  9. Error: The process '/opt/hostedtoolcache/goreleaser-action/0.160.0/x64/goreleaser' failed with exit code 1
复制代码


代码片段:
  1. func (f *Fs) shouldRetry(err error) (bool, error) {
  2.         if err == nil {
  3.                 return false, nil
  4.         }
  5.         if fserrors.ShouldRetry(err) {
  6.                 return true, err
  7.         }
  8.         switch gerr := err.(type) {
  9.         case *googleapi.Error:
  10.                 if gerr.Code >= 500 && gerr.Code < 600 {
  11.                         // All 5xx errors should be retried
  12.                         return true, err
  13.                 }
  14.                 if len(gerr.Errors) > 0 {
  15.                         reason := gerr.Errors[0].Reason
  16.                         if reason == "rateLimitExceeded" || reason == "userRateLimitExceeded" {
  17.                                 // 如果存在 ServiceAccountFilePath,调用 changeSvc, 重试
  18.                                 if(f.opt.ServiceAccountFilePath != ""){
  19.                                         f.waitChangeSvc.Lock()
  20.                                         f.changeSvc()
  21.                                         f.waitChangeSvc.Unlock()
  22.                                         return true, err
  23.                                 }
  24.                                 if f.opt.StopOnUploadLimit && gerr.Errors[0].Message == "User rate limit exceeded." {
  25.                                         fs.Errorf(f, "Received upload limit error: %v", err)
  26.                                         return false, fserrors.FatalError(err)
  27.                                 }
  28.                                 return true, err
  29.                         }
  30.                 }

  31.         // added by me
  32.         default:
  33.         reason := err.msg
  34.         if reason == "Max transfer limit reached as set by --max-transfer" {
  35.             // do something
  36.             if(f.opt.ServiceAccountFilePath != ""){
  37.                 f.waitChangeSvc.Lock()
  38.                 f.changeSvc()
  39.                 f.waitChangeSvc.Unlock()
  40.                 return true, err
  41.             }
  42.         }
  43.         // added by me
  44.         }
  45.         return false, err
  46. }
复制代码
发表于 2021-3-24 21:33:45 | 显示全部楼层
你想要的 err.msg 应该是 gerr.Errors[索引].Reason
 楼主| 发表于 2021-3-24 21:35:27 | 显示全部楼层
本帖最后由 CodyDoby 于 2021-3-24 21:37 编辑
naiba 发表于 2021-3-24 21:33
你想要的 err.msg 应该是 gerr.Errors[索引].Reason


开始就是这样写的,也提示 gerr没有Errors:

https://forum.rclone.org/t/how-to-define-one-case-for-errormaxtransferlimitreached-in-shouldretry-function/23041
发表于 2021-3-24 22:02:59 | 显示全部楼层
老哥代码嵌套的有点太深了,建议抽成func处理
发表于 2021-3-25 02:47:15 | 显示全部楼层
case 部分用来处理*googleapi.Error错误类型,
你这个default里怎么也得判断一下到底有没有发生错误吧,
如果没有发生错误err.msg会有值吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-5-11 03:56 , Processed in 0.060572 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表