Проверка ввода и обработка ошибок

Проверка ввода и обработка ошибок

Проверка ввода и обработка ошибок

Aspose.BarCode FOSS for Python проверяет все входные данные перед кодированием. Каждая симболика имеет специализированный подкласс InputParser, который проверяет наборы символов, ограничения длины и правила формата. При ошибке валидации библиотека генерирует типизированные исключения из иерархии BarcodeError, чтобы вызывающие могли различать проблемы ввода, сбои кодирования и проблемы рендеринга.


Слой InputParser

Каждая симболика регистрирует реализацию InputParser. Когда вы вызываете BarcodeService.generate(), сначала запускается парсер, который создает NormalizedPayload или генерирует InvalidInputError, если данные недействительны для этой симболики.

from aspose_barcode_foss import BarcodeService

service = BarcodeService()

# Valid Code 128 input — passes the Code128InputParser
barcode = service.generate("code128", "VALID-DATA-001")

# Invalid EAN-13 input — too few digits
try:
    barcode = service.generate("ean13", "123")
except Exception as e:
    print(type(e).__name__, e)

Каждый парсер симболики проверяет разные правила:

  • Code128InputParser — проверяет, что все символы находятся в диапазоне ASCII, поддерживаемом наборами символов Code 128
  • Code39InputParser — проверяет символы относительно базового или полного ASCII-алфавита Code 39 в зависимости от Code39Options.full_ascii
  • Ean13InputParser — требует ровно 12 или 13 цифр (13-я является контрольной цифрой)
  • Ean8InputParser — требует ровно 7 или 8 цифр
  • QrInputParser — проверяет данные в соответствии с выбранным QrEncodeMode (NUMERIC, ALPHANUMERIC, BYTE или KANJI)
  • UpcaInputParser — требует ровно 11 или 12 цифр
  • UpceInputParser — требует ровно 6, 7 или 8 цифр с действительным шаблоном UPC-E

Иерархия BarcodeError

Все исключения наследуются от BarcodeError, который расширяет встроенный Exception в Python. Иерархия позволяет использовать блоки catch на разных уровнях специфичности:

ExceptionВызывается, когда
BarcodeErrorБазовый класс для всех исключений библиотеки
InvalidInputErrorВходные данные не проходят проверку (неверные символы, неверная длина)
EncodingErrorЛогика кодирования завершается с ошибкой после прохождения проверки
RenderingErrorРендерер столкнулся с ошибкой при выводе SVG или PNG
SymbologyNotFoundErrorИмя символогии не зарегистрировано в SymbologyRegistry
UnsupportedCapabilityErrorЗапрошенная возможность недоступна для символогии
UnsupportedFeatureErrorФункция определена, но не реализована
from aspose_barcode_foss import BarcodeService
from aspose_barcode_foss.errors import (
    BarcodeError,
    InvalidInputError,
    EncodingError,
    SymbologyNotFoundError,
)

service = BarcodeService()

try:
    barcode = service.generate("code128", "TEST-001")
    svg = barcode.to_svg()
except InvalidInputError as e:
    print(f"Input rejected: {e}")
except EncodingError as e:
    print(f"Encoding failed: {e}")
except SymbologyNotFoundError as e:
    print(f"Unknown symbology: {e}")
except BarcodeError as e:
    print(f"Barcode error: {e}")

Проверка названий символики

SymbologyNotFoundError вызывается, когда BarcodeService.generate() получает название символьной системы, которое не зарегистрировано. SymbologyRegistry разрешает имена по каноническому имени или алиасу, поэтому "code128", "Code128" и "CODE128" все разрешаются к одному и тому же определению.

from aspose_barcode_foss import BarcodeService
from aspose_barcode_foss.errors import SymbologyNotFoundError

service = BarcodeService()

try:
    barcode = service.generate("invalid_type", "data")
except SymbologyNotFoundError as e:
    print(f"Not found: {e}")

Проверка контрольной цифры

Символьные системы EAN-13, EAN-8, UPC-A и UPC-E автоматически вычисляют контрольные цифры. Если вы передаете полные данные, включая контрольную цифру, парсер проверяет её против вычисленного значения. Свойство allow_check_digit_input в Ean13Options и Ean8Options управляет этим поведением.

from aspose_barcode_foss import BarcodeService
from aspose_barcode_foss import Ean13Options

service = BarcodeService()

# 12 digits — check digit computed automatically
barcode = service.generate("ean13", "590123412345")

# 13 digits — parser verifies the 13th digit matches the computed value
barcode = service.generate(
    "ean13", "5901234123457",
    encode=Ean13Options(allow_check_digit_input=True),
)

Советы и лучшие практики

  • Отлавливайте InvalidInputError в пользовательских формах ввода, где данные могут не соответствовать требованиям символьной системы
  • Используйте BarcodeError как универсальный перехватчик только тогда, когда нет необходимости различать типы ошибок
  • Проверьте название символьной системы относительно семи поддерживаемых символьных систем (code128, code39, ean13, ean8, qrcode, upca, upce) перед вызовом generate(), чтобы избежать SymbologyNotFoundError
  • Для кодов QR явно задайте encoding_mode через QrOptions, когда данные содержат не-ASCII символы
  • Позвольте библиотеке вычислять контрольные цифры вместо их ручного ввода — это предотвращает несоответствия

Распространённые проблемы

ПроблемаПричинаИсправление
InvalidInputError на EAN-13Данные содержат менее 12 цифр или включают нечисловые символыУкажите ровно 12 или 13 числовых цифр
SymbologyNotFoundErrorОпечатка в названии символики (например, "code_128" вместо "code128")Используйте каноническое имя без нижних подчёркиваний
EncodingError на Code 39Данные содержат строчные буквы без full_ascii=TrueУстановить Code39Options(full_ascii=True)
UnsupportedFeatureErrorВызов функции, которая определена, но ещё не реализованаПроверьте known_limitations в профиле символики
InvalidInputError на UPC-AДанные содержат более 12 цифрВведите ровно 11 или 12 цифр

FAQ

Как проверить, является ли имя символогии действительным перед генерацией?

Используйте BarcodeService.registry для доступа к SymbologyRegistry. Вызовите get_definition() и перехватите SymbologyNotFoundError, если имя не зарегистрировано.

Можно ли отключить проверку контрольных цифр для штрих-кодов EAN?

Парсер всегда проверяет контрольные цифры, когда вы передаёте ввод полной длины (13 цифр для EAN-13, 8 для EAN-8). Чтобы избежать проверки, передайте только цифры данных (12 для EAN-13, 7 для EAN-8) и позвольте библиотеке вычислить контрольную цифру.

Что произойдёт, если я передам бинарные данные в 1-мерную символогию штрих-кода?

InvalidInputError выбрасывается. Code 128, Code 39, EAN и UPC симболы принимают только текстовые данные. Для бинарных данных используйте QR Code с QrEncodeMode.BYTE.

Проверяет ли библиотека длину данных для кодов QR?

QrInputParser проверяет, что данные помещаются в ёмкость запрашиваемой версии QR. Если версия не указана, библиотека выбирает наименьшую версию, которая вмещает данные.


API Reference Сводка

Класс / МетодОписание:
InputParser.parse(data, options)Абстрактный метод — проверяет и нормализует ввод в NormalizedPayload
Code128InputParser.parse(data, options)Проверяет символы ввода Code 128
Code39InputParser.parse(data, options)Проверяет ввод Code 39 в базовом или полном ASCII
Ean13InputParser.parse(data, options)Проверяет количество цифр и контрольную цифру EAN-13
Ean8InputParser.parse(data, options)Проверяет количество цифр EAN-8 и контрольную цифру
QrInputParser.parse(data, options)Проверяет данные QR в соответствии с выбранным режимом кодирования
UpcaInputParser.parse(data, options)Проверяет количество цифр UPC-A
UpceInputParser.parse(data, options)Проверяет количество цифр UPC-E и шаблон
BarcodeErrorБазовое исключение для библиотеки штрихкодов
InvalidInputErrorВызывается при недопустимых входных данных
EncodingErrorВызывается, когда кодирование не удаётся
RenderingErrorВызывается, когда рендеринг не удаётся
SymbologyNotFoundErrorВызывается при незарегистрированных именах символогии
UnsupportedCapabilityErrorВызывается при недоступных возможностях
UnsupportedFeatureErrorВызывается при не реализованных функциях

См. также:

 Русский