英文:
how can i get the error code "os.ErrNotExist" from the error itself?
问题
这段代码可以在这里运行:https://play.golang.org/p/dX6dOzWS-Gx
cachedirstring := "./cache"
_, err = os.Stat(cachedirstring)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
fmt.Printf("%T\n", err)
}
os.Exit(1)
}
这段代码的输出是:
*fs.PathError
我知道从一本书中可以使用errors.Is(err, os.ErrNotExist)
。我的问题是,我如何知道errors.Is(err, os.ErrNotExist)
会返回true
(通过代码而不是搜索引擎)?
我如何找到所有与err
相等的目标错误?
英文:
This code can be run here: https://play.golang.org/p/dX6dOzWS-Gx
cachedirstring := "./cache"
_, err = os.Stat(cachedirstring)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
fmt.Printf("%T\n", err)
}
os.Exit(1)
}
This outputs:
*fs.PathError
I know to use errors.Is(err, os.ErrNotExist)
from a book. My question is, how could I know that errors.Is(err, os.ErrNotExist)
would return true
(through code, rather than a search engine) ?
How can I find all target errors that would equal err
?
答案1
得分: 2
你可以在“纸上”模拟 errors.Is 的行为:
- 当调用 errors.Unwrap 方法时,检查循环遍历错误链会发生什么。
- 对于每个错误,考虑它是否与目标相等(使用
==
),或者它是否实现了Is(error) bool
方法并且会返回 true。
例如,如果 syscall.Errno
类型具有正确的错误代码,那么这一行会使 errors.Is(..., os.ErrNoExist)
返回 true。
英文:
You can certainly emulate what errors.Is does "on paper":
- Check what looping through the chain of errors would do, when the erros.Unwrap method is called on it.
- For each error, consider whether it is
==
to the target, or if it implements theIs(error) bool
method and would return true for it.
For example, this line makes errors.Is(..., os.ErrNoExist)
true for the syscall.Errno
type if it has the right error code.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论