美文网首页
不要在可写文件上调用defer Close

不要在可写文件上调用defer Close

作者: kker | 来源:发表于2017-06-16 14:47 被阅读62次

当关闭一个可写文件时,该操作会又系统调用call完成,该调用可能会返回一下错误代码。

ERRORS
     The close() system call will fail if:

     [EBADF]            fildes is not a valid, active file descriptor.

     [EINTR]            Its execution was interrupted by a signal.

     [EIO]              A previously-uncommitted write(2) encountered an input/output
                        error.

当EIO 错误发生时,写入文件的操作将会丢失数据。如果还是直接 defer Close,我们将会丢失该错误消息。
因此,在defer中,我们应该再检查下Close返回的error是否为nil。

func helloNotes() (err error) {
    var f *os.File
    f, err = os.Create(/tmp/notes.txt")
    if err != nil {
        return
    }

    defer func() {
        cerr := f.Close()
        if err == nil {
            err = cerr
        }
    }()

    err = io.WriteString(f, "hello world")
    return
}
或者
func helloNotes() error {
    f, err := os.Create("/tmp/notes.txt")
    if err != nil {
        return err
    }
    defer f.Close()

    if err = io.WriteString(f, "hello world"); err != nil {
        return err
    }

    return f.Sync()
}

相关文章

  • 不要在可写文件上调用defer Close

    当关闭一个可写文件时,该操作会又系统调用call完成,该调用可能会返回一下错误代码。 当EIO 错误发生时,写入文...

  • 关闭流要点1_try异常管理

    close()关闭文件流当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法)...

  • Go语言之defer语句

    1. defer函数或方法 一个函数或方法的执行被延迟了 2. defer的用法: 对象.close(),临时文件...

  • Go语言defer关键字

    Go语言defer关键字 defer关键字用于延缓函数的执行 只需要在调用普通函数或方法前加上关键字defer,就...

  • defer

    defer 后面只能跟函数调用语句 defer 后面的调用语句在函数退出时调用 多个defer调用的时候,调用顺序...

  • 3-Python文件操作总结

    文件操作 文件读取 r表示读。 引入with语句来自动帮我们调用close()方法: 文件写入

  • go defer用法

    defer 通常用于 open/close, connect/disconnect, lock/unlock 等这...

  • Day10IO编程

    读文件 Python引入了with语句来自动帮我们调用close()方法: 调用read()会一次性读取文件的全部...

  • Python 中 open 和 with open 的区别

    open语法 with open语法 1)使用open方法,文件操作完毕后需要手动调用close()方法关闭文件。...

  • python文件操作

    文件用的时候要避免两次for循环第二次文件会被锁最后记得close文件,才能被第二次调用我的处理方法是 文件内容不...

网友评论

      本文标题:不要在可写文件上调用defer Close

      本文链接:https://www.haomeiwen.com/subject/whqmqxtx.html