Как обрабатывать исключения ядра PSD в .NET

Как обрабатывать исключения ядра PSD в .NET

Aspose.PSD FOSS для .NET определяет два типа исключений: PsdLoadException, генерируемое при разборе документа PSD/PSB, и PsdSaveException, генерируемое при его записи. Оба наследуются от System.Exception и поддерживают конструктор только с сообщением и конструктор с сообщением и вложенным исключением.

Пошаговое руководство

Шаг 1: Установите пакет

git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-.NET.git
cd Aspose.PSD-FOSS-for-.NET
dotnet build

Шаг 2: Импортируйте необходимые классы

using Aspose.PSD.FileFormats.Psd;

Шаг 3: Обработайте сбои во время загрузки

PsdLoadException выбрасывается, когда структура документа не проходит проверку — например, неподдерживаемая версия PSD/PSB, длина секции превышает объявленную границу окружающей секции или обрезанные данные потока:

try
{
    using var image = PsdImage.Load("input.psd");
}
catch (PsdLoadException ex)
{
    Console.WriteLine($"Failed to load PSD/PSB file: {ex.Message}");
}

Шаг 4: Обработать сбои во время сохранения

PsdSaveException выбрасывается при записи документа — например, когда строковое значение превышает длину, которую может удержать поле Pascal-строки PSD:

try
{
    image.Save("output.psd");
}
catch (PsdSaveException ex)
{
    Console.WriteLine($"Failed to save PSD/PSB file: {ex.Message}");
}

Шаг 5: Исследовать внутреннее исключение

Оба типа исключений имеют конструктор, который оборачивает внутреннее исключение (используется внутренне, например, когда ошибка ввода-вывода прерывает чтение структуры файла). Проверьте InnerException на предмет первопричины:

try
{
    using var image = PsdImage.Load("input.psd");
}
catch (PsdLoadException ex) when (ex.InnerException != null)
{
    Console.WriteLine($"Underlying I/O error: {ex.InnerException.Message}");
}

Распространённые проблемы и их решения

PsdLoadException с сообщением о неподдерживаемой версии. Объявленное в файле поле версии PSD не соответствует ни стандартному PSD, ни значению для крупного документа PSB. Убедитесь, что файл является подлинным, некоррумпированным PSD/PSB документом.

PsdLoadException с сообщением о том, что длина раздела превышает границу. Внутренние поля длины файла не соответствуют его реальному размеру — это обычно указывает на усечённый или повреждённый файл, а не на неподдерживаемый вариант.

PsdSaveException о длине Pascal-строки. Значение строки (например, имя слоя или ресурса) превышает 255 байт, что является максимумом, который может закодировать поле Pascal-строки в PSD. Укоротите значение перед сохранением.

Часто задаваемые вопросы

Общие ли у PsdLoadException и PsdSaveException базовый тип исключения?

Нет — обе наследуются непосредственно от System.Exception, а не друг от друга или от общего базового класса исключений Aspose.PSD.

Может ли PsdSaveException возникнуть по причинам, отличным от слишком длинного строкового значения?

Подтверждённое место выброса в этой FOSS-сборке — проверка длины Pascal-строки. Другие ошибки ввода-вывода во время сохранения (например, поток назначения, в который нельзя записать) проявляются как базовый тип исключения .NET, а не оборачиваются в PsdSaveException.

Будет ли перехват Exception также ловить эти два типа?

Да, поскольку оба наследуются от System.Exception — но перехват конкретных типов позволяет отличить ошибки загрузки от ошибок сохранения.

См. также:

 Русский