エラー
メソッドが例外をスローしない場合、エラーは発生していません。メソッドは約束した仕事を実行できたので、邪魔にならず、ある種のステータス コードを返そうとしません。成功したことがわかるので、ステータス コードを確認する必要はありません。
メソッドがコピー操作に失敗すると、例外がスローされます。この場合、メソッドは約束したジョブを実行できませんでした。これは、奇妙な (例外的な) 何かが発生したことを意味し、例外がスローされます。例外がスローされるため、それに対処することを余儀なくされるか、プログラムが爆発します。したがって、ステータス コードをチェックしても意味がありません。ステータス チェック コードに到達しないため、とにかくそのステータス コードを読み取ることができるコードを書くことはできませんでした。コード フローは、catch
ブロックまたはプログラムの終了に進みます。
これらの概念は、例外を使用したエラー処理の基礎です。
例外の処理方法
例外から回復する必要があり、合理的な方法がない限り、それらを処理しないでください。あなたのプログラムを爆発させましょう。これにより、未処理の例外によってスタック トレースが生成され、プログラムのどの部分が爆発したか、およびコードがどのようにしてその時点に到達したかが正確にわかるため、実際のコードのバグを見つけるのがはるかに簡単になります。
合理的な回復方法がある場合 (たとえば、エラー メッセージをユーザーに表示して操作を再試行するか、ユーザーに別のパラメーターを入力させるなど)、try
/catch
ブロックを記述できます。ブロックに例外をスローする可能性のあるコードをtry
記述し、ブロックに回復コードを記述しますcatch
。
try
{
var file = File.Open(filename);
// Todo: Work with open file here
}
catch(FileNotFoundException e)
{
MessageBox.Show("Failed to open file - " + e.ToString());
// Todo: Additional recovery here,
// like telling the calling code to re-open the file selection dialog
}
Exception
基本型をキャッチしてはならず、代わりに、処理可能な特定の派生例外タイプ (例: ) をキャッチする必要があることに注意してくださいFileNotFoundException
。OutOfMemoryException
から正常に回復するコードを書くことはおそらく不可能であり、その例外はコードの任意の時点でスローされる可能性があるため、これは理にかなっています。をキャッチすると、関心のある例外だけでなく、何でもException
処理しようとするコードを書いていることになります。
完了
File.Copy
同期操作です。したがって、メソッドが完了すると、実際のコピーが完了します。
これは、コピー行の直後にコード行を記述できることを意味します。そして、そのコードは、ファイルが完全にコピーされ、アクセス可能であることを期待できます。