明らかに、多くのアプリケーションでファイルを操作し、エラーをユーザーに表示する必要があります。しかし、System.IO.Fileクラスのメンバーは多くの例外をスローします。これらは、ちょうどReadAllTextためのものです:C# - System.IO.File.ReadAllTextによって生成された例外を単純化するための良い習慣です
- ArgumentExceptionが
- 例外ArgumentNullException
- PathTooLongException
- DirectoryNotFoundException
- にIOException
- UnauthorizedAccessException
- にFileNotFoundException
- 非サポート例外
- SecurityExceptionが
それでは、どのようにそれらのすべてをキャッチし、他の例外を飲み込むていないながら、ユーザーにそれらを表示するには?
明らかにあなたは排除することができますコーディング完璧これら2:
- ArgumentExceptionが
- 例外ArgumentNullException
あなたは(おそらく痛みを伴う)を記述する場合は、あなたがPathTooLongExceptionを排除することができます確認してください。しかし、なぜマイクロソフトが書いたチェック用のコードを複製するのですか?
しかし、あなたはすべてのチェックをした場合でも、他の例外がまだ発生します
- DirectoryNotFoundException
- にIOException
- UnauthorizedAccessException
- にFileNotFoundException
- 非サポート例外
- SecurityExceptionが
ファイルとフォルダがファイルを開く時間によって削除得ることができ、セキュリティ権限は、私はあなたがユーザーに表示メッセージを除き、これらのシナリオで何ができるかが表示されない
など変更することができます。 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
}
Microsoftがテーマと連動すべてのそれらの例外をグループ化していない理由を私は本当に理解していません何らかの方法で。私は何かを逃しているのですか、この良い練習ですか?
しかし、実際の結果はどうですか?あなたはこれらの例外すべてに特化した何もしません。あなたが本当にそれぞれ違うことをしなければならない場合は、同じ方法ですべてをテストすることになります。ジェネリック例外をキャッチしてそのメッセージを表示 – Steve
目的は例外を飲み込むことではありません私は何もできません。私は何か特定のことをすることができます - エラーが発生したことをユーザーに示します。 – Marko
@ SteveあなたはStackOverflow例外またはOutOfMemory例外を見逃します。現在のコードはFile例外のみに焦点を当てています。 – Artemix