输入验证和错误处理
输入验证与错误处理
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— 检查所有字符是否在 Code 128 字符集支持的 ASCII 范围内Code39InputParser— 根据Code39Options.full_ascii,将字符与 Code 39 基本或完整 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,该类扩展了 Python 内置的 Exception。层次结构允许在不同的特定级别捕获异常块:
| 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 符号会自动计算校验位。如果您传入包含校验位的完整数据,解析器会将其与计算值进行验证。Ean13Options 和 Ean8Options 上的 allow_check_digit_input 属性控制此行为。
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用作通用捕获 - 在调用
generate()之前,请将符号名称与七种受支持的符号(code128、code39、ean13、ean8、qrcode、upca、upce)进行比对,以避免SymbologyNotFoundError - 对于 QR 代码,当数据包含非 ASCII 字符时,请通过
QrOptions明确设置encoding_mode - 让库自行计算校验位,而不是手动提供——这可以避免不匹配
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
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 条码的校验位验证吗?
当您提供完整长度的输入时(EAN-13 为 13 位,EAN-8 为 8 位),解析器总是会验证校验位。若想避免验证,只提供数据位(EAN-13 为 12 位,EAN-8 为 7 位),让库自行计算校验位。
如果我将二进制数据传递给一维条码符号会怎样?
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 | 因未实现的特性而抛出 |