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