Как обрабатывать исключения PSD Core в Python

Как обрабатывать исключения 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 — но конкретные типы позволяют различать сбои загрузки и сбои сохранения.

См. также:

 Русский