Как проверить наличие ошибок при вызове os.Open (<filename>) в Go? - PullRequest
1 голос
/ 22 декабря 2011

Я новичок в Go (пока потратил 30 минут!) И пытаюсь выполнить File I / O.

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

При сбое вызова не должен ли он вернуть номер ошибки? Этот вызов возвращает os.Error, и у него нет других методов, кроме 'String ()'.

Это рекомендуемый способ проверки на ошибки в Go?

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Типичный код 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 голос
/ 22 декабря 2011

Да, это нормальный способ в Go (возвращение нескольких значений), создатели Go имеют другое представление об исключениях и обрабатывают его таким образом.

Читать это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...