c# -是简化System.IO.File.ReadAllText生成的异常的好方法

本文关键字:异常 方法 ReadAllText File IO System | 更新日期: 2023-09-27 18:15:24

显然,许多应用程序需要处理文件并向用户显示错误。然而,System.IO.File类的成员抛出了许多异常。这些只是用于ReadAllText:

    <
  • ArgumentException/gh>
  • ArgumentNullException
  • PathTooLongException
  • DirectoryNotFoundException
  • IOException
  • UnauthorizedAccessException
  • FileNotFoundException
  • NotSupportedException
  • SecurityException

那么如何捕获它们并将它们显示给用户,同时不吞噬其他异常呢?

显然,使用完美的编码,您可以消除这两个:

    <
  • ArgumentException/gh>
  • ArgumentNullException

如果你写一个(可能是痛苦的)检查,你可以消除PathTooLongException。但是为什么要复制微软编写的检查代码呢?

但是即使你做了所有的检查,仍然会发生其他异常:

  • DirectoryNotFoundException
  • IOException
  • UnauthorizedAccessException
  • FileNotFoundException
  • NotSupportedException
  • SecurityException

文件和文件夹可以在你打开文件的时候被删除,安全权限可以改变等等。

除了向用户显示消息外,我不知道在这些场景中你还能做什么。你会找到操作系统找不到的目录吗?修复权限?注入代码到操作系统,使不支持的操作支持?哈哈我所看到的可能就是显示一条错误消息。

因此,如果我每次打开文件读取文本时都必须捕获所有这些异常,我的代码将不得不长而重复,除非我通过捕获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
        }

我真的不明白为什么微软不以某种方式将所有这些例外分组在一起。是我错过了什么,还是这是很好的练习?

c# -是简化System.IO.File.ReadAllText生成的异常的好方法

您列出的异常属于两个不同的类别—这些表示编码错误,而这些表示运行时问题。您完全正确地认为第一类异常是可以预防的:您可以用这样一种方式编写代码,使它们永远不会发生。例如,如果您的代码null -检查路径,则在调用ReadAllText时不会有获得ArgumentNullException的危险。让我们逐一分析剩余的异常:

  • IOException, DirectoryNotFoundException, FileNotFoundException -如果您捕获IOException
  • ,则捕获所有三个
  • UnauthorizedAccessException -应该单独捕获
  • NotSupportedException -可以通过在调用之前验证路径来防止。
  • SecurityException -可以通过在呼叫前检查权限来防止。

最后,您可以通过捕获IOExceptionUnauthorizedAccessException来覆盖所有指示运行时问题的异常,并通过预先验证您计划传递的参数和检查代码的运行时环境来防止其他异常的发生。

您要查找的是System.IO.IOException.

System.IO.IOException的继承层次:

System.Object
  System.Exception
    System.SystemException
      System.IO.IOException
        System.IO.DirectoryNotFoundException
        System.IO.DriveNotFoundException
        System.IO.EndOfStreamException
        System.IO.FileLoadException
        System.IO.FileNotFoundException
        System.IO.PathTooLongException
        System.IO.PipeException

ArgumentException被两个众所周知的异常继承:

System.Object
  System.Exception
    System.SystemException
      System.ArgumentException
        System.ArgumentNullException
        System.ArgumentOutOfRangeException
        //...

典型的arithmelceexception:

System.Object
  System.Exception
    System.SystemException
      System.ArithmeticException
        System.DivideByZeroException
        System.NotFiniteNumberException
        System.OverflowException

同样值得注意的是ThreadAbortException,它应该在桌面应用程序或ASP中使用的异步事件委托中捕获。. NET重定向/终止HttpResponse。

其他异常太基本了,没有更多的"专门化基础异常"。请在System的参考资料中查找它们。异常的继承层次和在System。