System.IO には関数があります: string File.ReadAllText( string path );
File.ReadAllText を呼び出し、考えられるすべての例外を処理し、true/false を返し、エラー メッセージを保存する関数を作成しようとしています。
私が持っているのはこれです:
public static class FileNoBS
{
public static bool ReadAllText( string path, out string text, out string errorMessage )
{
errorMessage = null;
text = null;
bool operationSuccessful = false;
try
{
text = System.IO.File.ReadAllText( path );
operationSuccessful = true;
}
catch ( ArgumentNullException e )
{
errorMessage = "Internal software error - argument null exception in FileNoBs.ReadAllText\nMessage: " + e.Message;
}
catch ( ArgumentException e )
{
errorMessage = "Internal software error - path is a zero-length string, contains only white space, or contains one or more invalid characters as defined by InvalidPathChars in FileNoBs.ReadAllText.\nMessage: " + e.Message;
}
catch ( PathTooLongException e )
{
errorMessage = "The specified path was too long.\nMessage: " + e.Message;
}
catch ( DirectoryNotFoundException e )
{
errorMessage = "The specified directory was not found.\nMessage: " + e.Message;
}
catch ( FileNotFoundException e )
{
errorMessage = "The file specified in path was not found.\nMessage: " + e.Message;
}
catch ( IOException e )
{
errorMessage = "An I/O error occurred while opening the file.\nMessage: " + e.Message;
}
catch ( UnauthorizedAccessException e )
{
errorMessage = @"UnauthorizedAccessException
path specified a file that is read-only.
-or-
This operation is not supported on the current platform.
-or-
path specified a directory.
-or-
The caller does not have the required permission.\nMessage: " + e.Message;
}
catch ( NotSupportedException e )
{
errorMessage = "path is in an invalid format.\nMessage: " + e.Message;
}
catch ( SecurityException e )
{
errorMessage = "You do not have the required permission.\nMessage: " + e.Message;
}
return operationSuccessful;
}
}
値を返す関数で制御フローがどのように機能するかわかりません。UnauthorizedAccessException がキャッチされ、errorMessage が設定されているとしましょう
errorMessage = "You do not have the required permission..."
最終的に毎回実行されることは知っていますが、コンパイラーは最終ブロック内に戻ることを許可しません。それで、私のリターンは到達するかどうか?
別の質問は、公式のガイドラインに従いながら、これを単純化する方法です。「一般に、回復方法がわかっている例外のみをキャッチする必要があります。
File クラス (Move、Copy、Delete、ReadAllText、WriteAllText) から必要なすべての関数を実行し、次に Directory クラスを実行して、気にしないすべての例外をキャッチし、キャッチしないすべての例外をキャッチするためだけに、これらすべての長いコード ブロックを実行することを恐れています。それらの数が多すぎると、マイクロソフトはそれが悪いと言います。
ありがとうございました。
編集:これは例外を処理していない、これは「何か他のもの」であるなどのコメントを受け取りました。
私は自分のコードのクライアントであり、次のようなことをしたいと思っています:
if ( !FileNoBS.ReadAllText( path, text, errorMessage ) ) {
MessageBox.Show( errorMessage );
return;
}
// continue working with all errors taken care of - don't care for whatever reason file wasn't opened and read, user is notified and I am moving on with my life