使用 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
- 1 回答
- 0 關注
- 116 瀏覽
添加回答
舉報
0/150
提交
取消