Проверка ввода и обработка ошибок
Проверка ввода и обработка ошибок
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 128Code39InputParser— проверяет символы относительно базового или полного ASCII-алфавита Code 39 в зависимости отCode39Options.full_asciiEan13InputParser— требует ровно 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 | Вызывается при не реализованных функциях |