Как обрабатывать исключения PSD Core в Python
Aspose.PSD FOSS for Python определяет два типа исключений: PsdLoadException, возникающее при разборе документа PSD/PSB, и PsdSaveException, возникающее при его записи. Оба наследуются от встроенного Exception и принимают сообщение плюс необязательное внутреннее исключение.
Пошаговое руководство
Шаг 1: Установите пакет
git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-Python.git
cd Aspose.PSD-FOSS-for-Python
# No packaging manifest is published yet -- run from this folder,
# or add it to PYTHONPATH:
export PYTHONPATH=$PWD:$PYTHONPATHШаг 2: Импортируйте необходимые классы
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.coreexceptions.psdloadexception import PsdLoadException
from aspose_psd_foss.coreexceptions.psdsaveexception import PsdSaveExceptionШаг 3: Обработайте ошибки загрузки
PsdLoadException вызывается, когда структура документа не проходит проверку — например, неподдерживаемая версия PSD/PSB, длина секции превышает объявленную границу содержащей секции или данные потока усечены:
try:
image = PsdImage.load("input.psd")
except PsdLoadException as ex:
print(f"Failed to load PSD/PSB file: {ex}")Шаг 4: Перехватить ошибки во время сохранения
PsdSaveException вызывается при записи документа — например, когда строковое значение превышает длину, которую может удержать поле Pascal-строки PSD (255 байт):
try:
image.save("output.psd")
except PsdSaveException as ex:
print(f"Failed to save PSD/PSB file: {ex}")Шаг 5: Исследовать внутреннее исключение
Оба типа исключений принимают аргумент конструктора inner_exception (используется внутри, например, когда ошибка ввода-вывода прерывает чтение структуры файла). Проверьте inner_exception для определения первопричины:
try:
image = PsdImage.load("input.psd")
except PsdLoadException as ex:
if ex.inner_exception is not None:
print(f"Underlying I/O error: {ex.inner_exception}")Распространённые проблемы и их решения
PsdLoadException с сообщением о неподдерживаемой версии. Объявленное в файле поле версии PSD не соответствует ни стандартному PSD, ни значению для больших документов PSB. Убедитесь, что файл является подлинным, неповреждённым PSD/PSB документом.
PsdLoadException с сообщением о том, что длина раздела превышает границу. Внутренние поля длины файла не соответствуют его фактическому размеру — это обычно указывает на усечённый или повреждённый файл, а не на неподдерживаемый вариант.
PsdSaveException о длине строки Pascal. Значение строки (например, имя слоя или ресурса) превышает 255 байт, что является максимальным размером, который может закодировать поле строки Pascal в PSD. Сократите значение перед сохранением.
Часто задаваемые вопросы
Имеют ли PsdLoadException и PsdSaveException общий базовый тип исключения?
Нет — оба напрямую наследуются от встроенного Exception, а не друг от друга и не от общего базового класса исключений Aspose.PSD.
Может ли PsdSaveException возникнуть по причинам, отличным от слишком длинного значения строки?
Подтверждённое место выбрасывания в этой FOSS-сборке — проверка длины Pascal-строки. Другие ошибки ввода-вывода во время сохранения (например, поток назначения, в который нельзя записать) проявляются как базовый тип исключения Python, а не оборачиваются в PsdSaveException.
Будет ли перехват Exception также перехватывать эти два типа?
Да, поскольку оба наследуются от Exception — но конкретные типы позволяют различать сбои загрузки и сбои сохранения.