Ошибка strconv.ErrRange

Ошибка strconv.ErrRange возникает в пакете strconv, когда при преобразовании строки в число результат выходит за пределы допустимого диапазона целевого типа. Эта ошибка возвращается функциями парсинга, такими как ParseInt, ParseUint, ParseFloat и другими. Она сигнализирует о том, что число в строке слишком большое или слишком маленькое для представления в указанном типе данных.

Ошибка ErrRange является константой типа error и обычно используется вместе с типом *strconv.NumError, который содержит дополнительную информацию о возникшей ошибке. Эта ошибка позволяет разработчику корректно обработать ситуацию, когда входные данные не соответствуют ожидаемому числовому диапазону.

Синтаксис

govar ErrRange = errors.New("value out of range")

Ошибка возвращается функциями парсинга в составе структуры *strconv.NumError, поле Err которой содержит ссылку на ErrRange.

Пример

Давайте попробуем преобразовать строку с числом, превышающим максимальное значение для типа int8:

gopackage 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)
  }
}

Результат выполнения кода:

go"Value out of range for int8"
"strconv.ParseInt: parsing \"128\": value out of range"

Пример

Рассмотрим ситуацию с преобразованием отрицательного числа в беззнаковый тип uint16:

gopackage 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)
  }
}

Результат выполнения кода:

go"Negative value cannot be parsed to uint"
"strconv.ParseUint: parsing \"-1\": value out of range"

Пример

Теперь рассмотрим обработку ошибки при преобразовании с плавающей точкой, когда значение выходит за пределы типа float32:

gopackage 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)
  }
}

Результат выполнения кода:

go"Value exceeds float32 max limit"
"strconv.ParseFloat: parsing \"3.4028236e+39\": value out of range"

Смотрите также

  • функцию strconv.ParseInt,
    которая преобразует строку в целое число с проверкой диапазона
  • функцию strconv.ParseUint,
    которая преобразует строку в беззнаковое целое число
  • функцию strconv.ParseFloat,
    которая преобразует строку в число с плавающей точкой
  • ошибку strconv.ErrSyntax,
    которая возникает при синтаксически неверном формате числа