os.NewSyscallError în Go

Împachetează o eroare de apel de sistem într-un *os.SyscallError, adăugând numele apelului.

Sintaxă
func NewSyscallError(syscall string, err error) error

Ce face os.NewSyscallError

os.NewSyscallError creează o eroare *os.SyscallError care ține minte numele apelului de sistem (de exemplu "open", "bind") și eroarea originală. Mesajul devine apel: mesaj.

Dacă err este nil, funcția returnează nil, deci o poți folosi direct: return os.NewSyscallError("setsockopt", err). Eroarea originală rămâne accesibilă cu errors.Is și errors.As. O vei folosi mai ales când apelezi direct pachetul syscall sau golang.org/x/sys.

Parametri

Parametru Descriere
syscall Numele apelului de sistem, afișat în mesaj.
err Eroarea primită de la apel (de obicei un syscall.Errno).

Ce returnează

Un error de tip *os.SyscallError, sau nil dacă err este nil.

Exemple

Exemplul 1: Mesajul și eroarea din interior

package main

import (
    "errors"
    "fmt"
    "io/fs"
    "os"
    "syscall"
)

func main() {
    err := os.NewSyscallError("open", syscall.ENOENT)
    fmt.Println(err)
    fmt.Println("nu există:", errors.Is(err, fs.ErrNotExist))

    var se *os.SyscallError
    if errors.As(err, &se) {
        fmt.Println("apelul:", se.Syscall, "| eroarea:", se.Err)
    }
}

Rezultat

open: no such file or directory
nu există: true
apelul: open | eroarea: no such file or directory

Exemplul 2: Cu nil returnează nil

Funcția poate fi apelată direct în return, fără să verifici înainte dacă a existat o eroare.

package main

import (
    "fmt"
    "os"
    "syscall"
)

func leaga(err error) error {
    // returnează nil dacă apelul a reușit, altfel eroarea cu numele apelului
    return os.NewSyscallError("bind", err)
}

func main() {
    fmt.Println(leaga(nil) == nil)
    fmt.Println(leaga(syscall.EADDRINUSE))
}

Rezultat

true
bind: address already in use

Greșeli frecvente

  • Compari mesajul erorii ca text (err.Error() == "..."). Folosește errors.Is(err, syscall.ENOENT) sau fs.ErrNotExist.

Comenzi înrudite

  • os.IsNotExist: IsNotExist spune dacă o eroare înseamnă „fișierul nu există”; IsExist, dacă înseamnă „există deja”.
  • os.IsPermission: Spune dacă o eroare a apărut din lipsa drepturilor de acces (permission denied).