为了账号安全,请及时绑定邮箱和手机立即绑定

无法从恐慌中恢复 - 完全跳过延迟

无法从恐慌中恢复 - 完全跳过延迟

Go
慕莱坞森 2022-08-24 12:48:13
使用 io.与无效的作家一起复制,我得到恐慌 - 这是意料之中的。但是,在这种情况下,我无法恢复。我的延迟恢复完全被绕过。代码如下:package mainimport (    "context"    "fmt"    "io"    "log"    "os"    "runtime"    "runtime/debug"    "cloud.google.com/go/storage")func main() {    var (        ctx      = context.Background()        fromFile = "blah.txt"        bucket   = "blah-bucket"        path     = "blah-path"    )    defer func() {        if result := recover(); result != nil {            buf := make([]byte, 1<<16)            length := runtime.Stack(buf, false)            log.Fatalf("PANIC RECOVER: %v\nSTACK: \n%s", result, buf[:length])            debug.PrintStack()        }    }()    err := FakeUpload(ctx, fromFile, bucket, path)    if err != nil {        fmt.Println(err)    }    fmt.Println("HELLO")}func FakeUpload(ctx context.Context, fromFile, toBucket, toPath string) (err error) {    var (        file   *os.File        client *storage.Client        wc     *storage.Writer    )    defer func() {        for _, c := range []io.Closer{wc, file} {            if c != nil {                err = c.Close()                if err != nil {                    return                }            }        }    }()    file, err = os.Open(fromFile)    if err != nil {        err = fmt.Errorf("problem opening file %v: %v", fromFile, err)        return    }    wc = client.Bucket(toBucket).Object(toPath).NewWriter(ctx)    _, err = io.Copy(wc, file) // THE UNRECOVERABLE PANIC HAPPENS HERE    return}踢球者是,如果它在其他地方恐慌,例如我指向一个无效的文件,它会恐慌,延迟恢复正确捕获它。这让我感到困惑。有什么想法吗?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

正如你可以在上面的评论中读到的那样,答案是作家正在创造一个goroutine,并在那里投入恐慌。GO不允许您从另一个Goroutine中恢复。cloud.google.com/go/storage



查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信