golang中defer延迟处理的函数如果有err返回值,要怎么处理呢?

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("./src/main/test.txt")
    if err != nil {
        fmt.Println("open error ", err)
    }
    defer file.Close()
    fmt.Println(file)
}

defer file.Close()这句话在goland中会有蒙灰提示,说Unhandled error,close时有可能发生错误,我该如何处理这个错误呢?

阅读 8k
1 个回答

1.结构清晰时可以不用上面的defer
2.defer的函数出现错误,可以选择以下几种处理方案:
2.1 严重错误,直接panic
2.2 一般错误,如果函数返回参数中有error类型的,可以直接修改这个返回值(当然必须使用命名返回值)告诉调用者。也可以仅仅将错误的情况输出日志,然后让函数返回一个空的结果,比如nil指针。

上面的代码,首先可以不用defer,直接处理就好了:

err = file.Close()
if err != nil {
    log.Fatal(err)
}

在返回路径复杂使用defer比较方便时,可以将出错代码放在一个匿名函数中:

defer func() {
    err := file.Close()
    if err != nil {
        // 记录日志
        fmt.Fprintf("file close: %v", err)
        // ...
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题