明らかに、多くのアプリケーションがファイルを操作し、ユーザーにエラーを表示する必要があります。ただし、System.IO.File クラスのメンバーは多くの例外をスローします。これらは ReadAllText 専用です:
- ArgumentException
- ArgumentNullException
- PathTooLongException
- DirectoryNotFoundException
- IO例外
- UnauthorizedAccessException
- FileNotFoundException
- サポートされていない例外
- セキュリティ例外
では、他の例外を飲み込まずに、それらをすべてキャッチしてユーザーに表示するにはどうすればよいでしょうか?
明らかに、完璧なコーディングを使用すると、次の 2 つを排除できます。
- ArgumentException
- ArgumentNullException
(おそらく面倒な) チェックを記述すれば、PathTooLongException を排除できます。しかし、なぜ Microsoft が作成したチェック用のコードを複製するのでしょうか?
ただし、すべてのチェックを行った場合でも、他の例外が発生する可能性があります。
- DirectoryNotFoundException
- IO例外
- UnauthorizedAccessException
- FileNotFoundException
- サポートされていない例外
- セキュリティ例外
ファイルやフォルダーは、ファイルを開くまでに削除されたり、セキュリティ権限が変更されたりする可能性があります。
ユーザーにメッセージを表示する以外に、これらのシナリオで何ができるかわかりません。OSが見つけられないディレクトリを見つけるつもりですか?権限を修正しますか? サポートされていない操作をサポートするために OS にコードを挿入しますか? LOL 可能なのは、エラーメッセージを表示することだけです。
したがって、テキストを読み取るためにファイルを開くたびにこれらすべての例外をキャッチする必要がある場合、Exception をキャッチして例外を飲み込まない限り、コードは長くて反復的でなければなりません。
FileException を作成し、実際にファイルを操作しているときに発生する可能性のあるすべての例外をキャッチすることは良い習慣でしょうか? 私が念頭に置いていたのはこれです:
public class FileException : Exception
{
public FileException( Exception e )
: base( e.Message, e.InnerException )
{
}
}
public static class FileNoBS
{
public static string ReadAllText2( string path )
{
try
{
return File.ReadAllText( path );
}
catch ( ArgumentNullException e )
{
throw new FileException( e );
}
catch ( ArgumentException e )
{
throw new FileException( e );
}
catch ( PathTooLongException e )
{
throw new FileException( e );
}
catch ( DirectoryNotFoundException e )
{
throw new FileException( e );
}
catch ( FileNotFoundException e )
{
throw new FileException( e );
}
catch ( IOException e )
{
throw new FileException( e );
}
catch ( UnauthorizedAccessException e )
{
throw new FileException( e );
}
catch ( NotSupportedException e )
{
throw new FileException( e );
}
catch ( SecurityException e )
{
throw new FileException( e );
}
}
}
次に、例外をキャッチするときに、次のように書くだけです。
try
{
string text = FileNoBS.ReadAllText2( path );
}
catch ( FileException e )
{
// display error to user
}
マイクロソフトがこれらすべての例外を何らかの方法でグループ化していない理由がよくわかりません。何か不足していますか、それともこれは良い習慣ですか?