显然,许多应用程序需要处理文件并向用户显示错误。然而 System.IO.File 类的成员抛出了很多异常。这些仅适用于 ReadAllText:
- 参数异常
- 参数NullException
- 路径过长异常
- DirectoryNotFoundException
- IO异常
- 未授权访问异常
- FileNotFoundException
- 不支持异常
- 安全异常
那么如何在不吞下其他异常的情况下捕获它们并将它们显示给用户呢?
显然,通过完美的编码,您可以消除这两个:
- 参数异常
- 参数NullException
如果你写了一个(可能很痛苦的)检查,你可以消除 PathTooLongException。但是,为什么要复制 Microsoft 编写的检查代码呢?
但即使您完成了所有检查,其他异常仍然可能发生:
- DirectoryNotFoundException
- IO异常
- 未授权访问异常
- FileNotFoundException
- 不支持异常
- 安全异常
当您打开文件时,文件和文件夹可能会被删除,安全权限可能会更改等。
除了向用户显示消息外,我看不到在这些情况下您可以做什么。您要查找操作系统找不到的目录吗?修复权限?将代码注入操作系统以支持不受支持的操作?大声笑我所看到的只是显示一条错误消息。
因此,如果我每次打开文件以读取文本时都必须捕获所有这些异常,那么我的代码将不得不冗长且重复,除非我通过捕获 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
}
我真的不明白为什么微软没有以某种方式将所有这些例外归为一类。我错过了什么还是这是一种好习惯?