あなたの質問の問題の 1 つは、目的のセマンティクスを指定していないことです。考えられる解釈は 2 つあります。どちらのソリューションが優れているかは、その選択によって異なります。フォールバックを読み込めないのは致命的なエラーだと思います。
- 最初のファイルが存在する場合はそれをロードし、存在しない場合は 2 番目のファイルをロードします。最初のファイルが存在するがロードできなかった場合は、エラーを表示します。
- 最初のファイルを読み込めない場合は、2 番目のファイルにフォールバックします。
1) のセマンティクスが必要な場合は、最初のコードで問題ありません。
2) のセマンティクスが必要な場合は、どちらも適切ではありません。次の理由により、最初のコードにはこれらのセマンティクスがありません。
- 競合状態があります。ファイルの存在を確認してからロードするまでの間にイメージが削除されると、失敗します。
- ファイルが存在するがロードできない場合は、例外がスローされます。これは、ファイルが有効な画像ではないか、開くことができない場合に発生する可能性があります。
2 番目のものは、よくあるケースの例外を使用していますが、これは悪いことです。
したがって、私が使用する 2 番目のセマンティクスを実現するには、次のようにします。
procedure LoadImage(img: TImage; filename: string);
var success:boolean;
begin
success := false;
if FileExists(filename)
then try
img.Picture.LoadFromFile(filename);
success := true;
except
end
if not success
then img.Picture.LoadFromFile('default.jpg');
end;
開く前に存在をチェックすると、エラーの場合は速くなりますが、成功の場合は遅くなります。したがって、どちらが速いかは、使用状況によって異なります。
個人的には、正常に動作しているアプリケーションが例外をスローするべきではないと考えているため、画像がたまにしか見つからない場合でも、2 番目のバリアントよりも 3 番目のバリアントを使用します。ベンチマークでパフォーマンスの問題が顕著であることが判明した場合にのみ、パフォーマンスの問題を気にします。
より対象を絞った例外句も検討する必要があります。すべての例外をキャッチするブランケットはスタイルが悪いです。残念ながら、どの例外が によってスローされるかについて明確な仕様を見つけることができなかったTPicture.LoadFromFile
ので、ここではブランケット節にとどめておきます。