Problem: You want to check for specific errors or specific types of errors.
Solution: Use the errors.Is and errors.As functions. The errors.Is function compares an error to a value and the errors.As function checks if an error is of a specific type.
Using errors.Is
The errors.Is function is essentially an equality check. Let’s say you define a set of customized errors in your codebase — for example, ApiErr — which happens when a connection to an API encounters an error:
var ApiErr error = errors.New("Error trying to get data from API")
Elsewhere in your code, you have a function that returns this error:
func connectAPI() error { // some other stuff happening here return ApiErr }
You can use errors.Is to check if the error returned is ApiErr :
if err != nil { if errors.Is(err, ApiErr) { // handle the API error } }
You can also verify if ApiErr is somewhere along the chain of wrapped errors. Take the example of a connect function that returns a ConnectionError that wraps around ApiErr :
func connect() error { return &ConnectionError{ Host: "localhost", Port: 8080, Err: ApiErr, } }
This code still works because ConnectionError wraps around ApiErr :
err := connect() if err != nil { if errors.Is(err, ApiErr) { // handle the API error } }
Using errors.As
The errors.As function allows you to check for a specific type of error. Continue with the same example, but this time around, you want to check if the error is of the type ConnectionError :
err := connect() if err != nil { var connErr *ConnectionError if errors.As(err, &connErr) { log.Errorf("Cannot connect to host %s at port %d", connErr.Host, connErr.Port) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律