如何在Go?</filename>中调用os.Open(<filename>)时检查错误

时间:2011-12-21 20:40:01

标签: coding-style go

我是Go的新手(到目前为止花了30分钟!)并且我正在尝试进行文件I / O.

  file, ok := os.Open("../../sample.txt")
  if ok != nil {
    // error handling code here
    os.Exit(1)
  }
  ... 

当呼叫失败时,是否应该返回错误号码?此调用返回os.Error,它没有'String()'以外的方法。

这是推荐的方法来检查Go中的错误吗?

2 个答案:

答案 0 :(得分:3)

典型的Go代码(使用os包)不分析返回的错误对象。它只是将错误消息打印给用户(然后根据打印的消息知道出现了什么问题)或者将错误按原样返回给调用者。

如果你想阻止你的程序打开一个不存在的文件,或者想要检查文件是否可读/写,我建议在打开文件之前使用os.Stat函数。

您可以分析返回错误的Go类型,但这似乎不方便:

package main

import "fmt"
import "os"

func main() {
    _, err := os.Open("non-existent")
    if err != nil {
        fmt.Printf("err has type %T\n", err)
        if err2, ok := err.(*os.PathError); ok {
            fmt.Printf("err2 has type %T\n", err2.Error)
            if errno, ok := err2.Error.(os.Errno); ok {
                fmt.Fprintf(os.Stderr, "errno=%d\n", int64(errno))
            }
        }

        fmt.Fprintf(os.Stderr, "%s\n", err)
        os.Exit(1)
    }
}

打印:

err has type *os.PathError
err2 has type os.Errno
errno=2
open non-existent: no such file or directory

答案 1 :(得分:1)

是的,这是Go中的常规方式(多值返回),Go的制作者对异常有不同的看法并以这种方式处理它。

阅读本文:

http://www.softmachinecubed.com/tech/2009/12/6/googles-go-language-multi-value-return-vs-exceptions-c.html