.NET での PSD Core 例外の処理方法
Aspose.PSD FOSS for .NET は 2 つの例外タイプを定義しています: 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 はドキュメントを書き込んでいる最中にスローされます — 例として、文字列値が PSD の Pascal 文字列フィールドが保持できる長さを超える場合があります:
try
{
image.Save("output.psd");
}
catch (PsdSaveException ex)
{
Console.WriteLine($"Failed to save PSD/PSB file: {ex.Message}");
}ステップ 5: 内部例外を検査する
両方の例外タイプには、内部例外をラップするコンストラクタがあります(内部で使用され、例えば I/O エラーがファイル構造の読み取りを中断したときなど)。根本原因については 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 バイトを超えています。これは PSD の Pascal 文字列フィールドがエンコードできる最大サイズです。保存する前に値を短くしてください。
よくある質問
PsdLoadException と PsdSaveException は共通の基底例外型を共有していますか?
いいえ — 両方とも直接 System.Exception から派生しており、互いにまたは共通の Aspose.PSD 基底例外クラスからは派生していません。
PsdSaveException は、長い文字列値以外の理由で発生することがありますか?
この FOSS ビルドで確認されたスロー箇所は Pascal 文字列長チェックです。その他の保存時 I/O 失敗(例として、書き込みできない宛先ストリームなど)は、PsdSaveException でラップされるのではなく、基底の .NET 例外型として表れます。
Exception を捕捉すると、これら 2 つの型も捕捉されますか?
はい、両方とも System.Exception から派生していますが—ただし、特定の型を捕捉することで、ロード失敗とセーブ失敗を区別できます。