JavaScriptを有効にしてください

golangのファイル存在チェックでIsNotExistが効かない

 · 

golangのファイル存在チェックでIsNotExistが効かない

【2022年4月14日追記】
読んで参考にされていた方、申し訳ありません。
エラー処理について根本的な所を間違えていました…。

os.IsNotExist関数は今は使用せずに、errors.Is(fs.ErrNotExist)を使用して判定を行います。
errors.Is関数はラップされたエラーを辿って比較してくれるため、errors.Cause関数で取り出す必要はありません。

間違っていたコードは消して書き直しました。

ファイルの存在チェックで、ログだけ出力して先に進む処理を書こうと思い、IsNotExist関数を使ってチェックしようとしましたが、うまく判定ができないパターンがありました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
	"fmt"
	"os"

	"github.com/pkg/errors"
)

func main() {
	read_text, err := readTextFile("test.txt")
	if errors.Is(err, fs.ErrNotExist) {
		fmt.Println("1.ファイルが見つかりません")
	} else if err != nil {
		//上記以外のエラー
		panic(err)
	}

	fmt.Println(read_text)

}

func readTextFile(s string) (string, error) {
	bytes, err := os.ReadFile(s)
	if err != nil {
		//スタック情報を付与
		return "", errors.WithStack(err)
	}

	read_text := string(bytes)

	return read_text, nil
}

上記コードを実行すると「2.ファイルが見つかりません」が表示されます。

os.IsNotExisterrors.WithStackなどで元のerrorが書き換えられると機能しなくなります。
その場合はerrors.Causeで元のerrorを取り出してから与えるようにしましょう。

このようにerrors.Is関数で一発解決です😇
もっとGo言語のエラー処理について学んでいこうと思います。

実行環境

1
2
~/$ go version
go version go1.18 linux/amd64

スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア