kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -36- <Error,Unwrap>

こんにちは、kurumi-bioです。
第7回目のexecパッケージ(標準ライブラリー)の学習です。

環境

  • Windows
    OSバージョン:Windows11 Home 22H2
    Go言語のバージョン:go version go1.20.3 windows/amd64
  • Linux
    OSバージョン:openSUSE Leap 15.4
    Go言語のバージョン:go version go1.20.1 linux/amd64

Error型

type Error struct {
    // Name is the file name for which the error occurred.
    Name string
    // Err is the underlying error.
    Err error
}

type Errorの説明 ファイルを実行可能ファイルとして分類できない場合、LookPath によってエラーが返されます。

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage:ErrorTest fileName")
        os.Exit(1)
    }

    p, e := exec.LookPath(os.Args[1])
    if e != nil {
        fmt.Fprintf(os.Stderr, "型情報=[%T]\n", e)
        ee := e.(*exec.Error)
        fmt.Fprintf(os.Stderr, "name=[%s]\n", ee.Name)
        fmt.Fprintf(os.Stderr, "err=[%v]\n", ee.Err)
    } else {
        fmt.Printf("Path=[%s]\n", p)
    }
}

コードの説明 exec.LookPath関数で、起動時の引数で指定された名前の実行可能ファイルを検索します。 エラーが戻ってきた場合は、*exec.Errorに型変換して、変数NameとErrの値を標準エラーに出力します。

◆実行結果(Windows)

実行結果の説明 ErrorTest.goという実行形式ではないファイルを指定しましたが、エラーにならないでパスが表示されました。
ファイルが存在しない場合は、file does not exist(ファイルが存在しません)のエラーが発生しました。

◆実行結果(Linux)

実行結果の説明 Linuxの場合は、実行できないファイルを指定した場合、permission denied(アクセス拒否)のエラーが発生しました。

Error関数

func (e *Error) Error() string

関数の説明無し

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage:ErrorTest fileName")
        os.Exit(1)
    }

    p, e := exec.LookPath(os.Args[1])
    if e != nil {
        ee := e.(*exec.Error)
        fmt.Fprintf(os.Stderr, "Err()=[%s]\n", ee.Error())
    } else {
        fmt.Printf("Path=[%s]\n", p)
    }
}

コードの説明 LookPath関数の戻り値errorをi.(T)を使って*exec.Errorにキャストしてから、
Error()関数の戻り値を出力しています。

◆実行結果(Linux)

実行結果の説明 エラー内容が出力されました。

Unwrap関数

func (e *Error) Unwrap() error

関数の説明無し

◆テストコード

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "usage:ErrorTest fileName")
        os.Exit(1)
    }

    p, e := exec.LookPath(os.Args[1])
    if e != nil {
        ee := e.(*exec.Error)
        fmt.Fprintf(os.Stderr, "Unwrap=[%s]\n", ee.Unwrap().Error())
    } else {
        fmt.Printf("Path=[%s]\n", p)
    }
}

コードの説明 LookPath関数の戻り値errorをi.(T)を使って*exec.Errorにキャストしてから、
Unwrap().Error()関数の戻り値を出力しています。

◆実行結果(Linux)

実行結果の説明 エラー内容が出力されました。

最後までご覧いただきありがとうございます