如何使用errors.Is判断ParseInt类型错误是否为strconv.NumError?
检测strconv.ParseInt错误的方法
strconv.ParseInt执行失败时,通常会返回两种明确的错误类型,你可以用errors.Is直接匹配预定义的错误值来检测:
strconv.ErrSyntax:输入字符串不是合法的整数格式strconv.ErrRange:输入数值超出了目标整数类型的取值范围
具体实现示例
package main import ( "errors" "fmt" "strconv" ) func main() { // 示例1:格式错误的输入 input1 := "xyz789" _, err := strconv.ParseInt(input1, 10, 64) if err != nil { if errors.Is(err, strconv.ErrSyntax) { fmt.Println("错误:输入不是有效的整数格式") } else if errors.Is(err, strconv.ErrRange) { fmt.Println("错误:输入数值超出目标类型范围") } else { fmt.Printf("未知错误:%v\n", err) } } // 示例2:超出范围的输入 input2 := "9223372036854775808" // 比int64最大值大1 _, err = strconv.ParseInt(input2, 10, 64) if err != nil { if errors.Is(err, strconv.ErrRange) { fmt.Println("错误:输入数值超出int64的取值范围") } } }
原理说明
strconv.ParseInt返回的错误实际是*strconv.NumError类型,该类型包含一个Err字段,存储的就是strconv.ErrSyntax或strconv.ErrRange。errors.Is会递归遍历错误链,匹配底层的错误值,因此能准确识别错误类型。
如果需要获取更详细的错误上下文(比如具体的输入字符串、出错的操作),可以通过类型断言获取*strconv.NumError实例:
if err != nil { numErr, ok := err.(*strconv.NumError) if ok { fmt.Printf("操作:%s,输入值:%s,错误原因:%v\n", numErr.Func, numErr.Num, numErr.Err) } }
内容的提问来源于stack exchange,提问作者Rajeshwar
相关产品推荐
相关产品推荐

