Ошибка strconv.ErrRange
Ошибка strconv.ErrRange возникает в пакете strconv,
когда при преобразовании строки в число результат выходит
за пределы допустимого диапазона целевого типа. Эта ошибка
возвращается функциями парсинга, такими как ParseInt,
ParseUint, ParseFloat и другими. Она сигнализирует
о том, что число в строке слишком большое или слишком маленькое
для представления в указанном типе данных.
Ошибка ErrRange является константой типа error
и обычно используется вместе с типом *strconv.NumError,
который содержит дополнительную информацию о возникшей ошибке.
Эта ошибка позволяет разработчику корректно обработать ситуацию,
когда входные данные не соответствуют ожидаемому числовому
диапазону.
Синтаксис
var ErrRange = errors.New("value out of range")
Ошибка возвращается функциями парсинга в составе структуры
*strconv.NumError, поле Err которой содержит
ссылку на ErrRange.
Пример
Давайте попробуем преобразовать строку с числом, превышающим
максимальное значение для типа int8:
package main
import (
"fmt"
"strconv"
)
func main() {
val := "128"
res, err := strconv.ParseInt(val, 10, 8)
if err != nil {
if err.(*strconv.NumError).Err == strconv.ErrRange {
fmt.Println("Value out of range for int8")
}
fmt.Println(err)
} else {
fmt.Println(res)
}
}
Результат выполнения кода:
"Value out of range for int8"
"strconv.ParseInt: parsing \"128\": value out of range"
Пример
Рассмотрим ситуацию с преобразованием отрицательного числа
в беззнаковый тип uint16:
package main
import (
"fmt"
"strconv"
)
func main() {
val := "-1"
res, err := strconv.ParseUint(val, 10, 16)
if err != nil {
if err.(*strconv.NumError).Err == strconv.ErrRange {
fmt.Println("Negative value cannot be parsed to uint")
}
fmt.Println(err)
} else {
fmt.Println(res)
}
}
Результат выполнения кода:
"Negative value cannot be parsed to uint"
"strconv.ParseUint: parsing \"-1\": value out of range"
Пример
Теперь рассмотрим обработку ошибки при преобразовании
с плавающей точкой, когда значение выходит за пределы
типа float32:
package main
import (
"fmt"
"strconv"
)
func main() {
val := "3.4028236e+39"
res, err := strconv.ParseFloat(val, 32)
if err != nil {
if err.(*strconv.NumError).Err == strconv.ErrRange {
fmt.Println("Value exceeds float32 max limit")
}
fmt.Println(err)
} else {
fmt.Println(res)
}
}
Результат выполнения кода:
"Value exceeds float32 max limit"
"strconv.ParseFloat: parsing \"3.4028236e+39\": value out of range"
Смотрите также
-
функцию
strconv.ParseInt,
которая преобразует строку в целое число с проверкой диапазона -
функцию
strconv.ParseUint,
которая преобразует строку в беззнаковое целое число -
функцию
strconv.ParseFloat,
которая преобразует строку в число с плавающей точкой -
ошибку
strconv.ErrSyntax,
которая возникает при синтаксически неверном формате числа