Go中是否可认定strconv.Parse*函数返回的错误均源于非法输入?
strconv.ParseUint错误处理的争议:到底要不要区分哨兵错误?
结论先行
直接把strconv.ParseUint返回的所有错误当成输入非法处理完全没问题,没必要纠结哨兵错误,也不用把错误往上抛。
为什么不会有非输入类错误?
别想复杂了,ParseUint的实现逻辑决定了它不可能返回输入以外的错误:
- 它只做纯内存里的字符串解析和数值计算,不碰IO、不申请额外内存(除了内部临时变量,不会有分配失败的情况),连系统调用都没有。
- 源码里明确只有两种错误输出:
strconv.ErrSyntax(格式不对,比如带非数字字符)和strconv.ErrRange(数值超出uint的范围),所有错误都会包装成*strconv.NumError返回,没有其他错误分支。
函数接口返回error只是Go的错误规范要求,不代表真的会有其他错误类型。
标准库示例的逻辑不是“随大流”
那些直接把错误当非法输入的标准库示例,不是因为别人都这么做,而是开发者清楚ParseUint的错误根源只有输入问题。这种处理是准确的,不是敷衍。
文档没写死的原因
标准库文档没明确说“不会有输入外的错误”,是因为这是纯计算型函数的默认约定——只要是不依赖外部资源、只处理输入参数的函数,错误必然来自参数本身。如果有其他风险,文档一定会特意说明(比如涉及IO的函数)。
最后给你个定心丸
要是还是不放心,直接去看strconv包的parseUint函数源码,整个错误返回的逻辑一目了然,根本找不到能产生其他错误的地方。按评审者的建议处理就行,没毛病。
内容的提问来源于stack exchange,提问作者pcronin
相关产品推荐
相关产品推荐

