liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
package os
 
import (
   "errors"
   "internal/poll"
)
 
// Portable analogs of some common system call errors.
var (
   ErrInvalid    = errors.New("invalid argument") // methods on File will return this error when the receiver is nil
   ErrPermission = errors.New("permission denied")
   ErrExist      = errors.New("file already exists")
   ErrNotExist   = errors.New("file does not exist")
   ErrClosed     = errors.New("file already closed")
   ErrNoDeadline = poll.ErrNoDeadline
)
 
type timeout interface {
   Timeout() bool
}
 
// PathError records an error and the operation and file path that caused it.
type PathError struct {
   Op   string
   Path string
   Err  error
}
 
func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
 
// Timeout reports whether this error represents a timeout.
func (e *PathError) Timeout() bool {
   t, ok := e.Err.(timeout)
   return ok && t.Timeout()
}
 
// SyscallError records an error from a specific system call.
type SyscallError struct {
   Syscall string
   Err     error
}
 
func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }
 
// Timeout reports whether this error represents a timeout.
func (e *SyscallError) Timeout() bool {
   t, ok := e.Err.(timeout)
   return ok && t.Timeout()
}
 
// NewSyscallError returns, as an error, a new SyscallError
// with the given system call name and error details.
// As a convenience, if err is nil, NewSyscallError returns nil.
func NewSyscallError(syscall string, err error) error {
   if err == nil {
       return nil
   }
   return &SyscallError{syscall, err}
}
 
// IsExist returns a boolean indicating whether the error is known to report
// that a file or directory already exists. It is satisfied by ErrExist as
// well as some syscall errors.
func IsExist(err error) bool {
   return isExist(err)
}
 
// IsNotExist returns a boolean indicating whether the error is known to
// report that a file or directory does not exist. It is satisfied by
// ErrNotExist as well as some syscall errors.
func IsNotExist(err error) bool {
   return isNotExist(err)
}
 
// IsPermission returns a boolean indicating whether the error is known to
// report that permission is denied. It is satisfied by ErrPermission as well
// as some syscall errors.
func IsPermission(err error) bool {
   return isPermission(err)
}
 
// IsTimeout returns a boolean indicating whether the error is known
// to report that a timeout occurred.
func IsTimeout(err error) bool {
   terr, ok := underlyingError(err).(timeout)
   return ok && terr.Timeout()
}
 
// underlyingError returns the underlying error for known os error types.
func underlyingError(err error) error {
   switch err := err.(type) {
   case *PathError:
       return err.Err
   case *LinkError:
       return err.Err
   case *SyscallError:
       return err.Err
   }
   return err
}