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șteerrors.Is(err, syscall.ENOENT)saufs.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).