我经常发现自己与文件以某种方式但是之后写的代码我总是不确定如何rubust它实际上是。问题是,我不完全确定如何文件有关的操作可能会失败,因此,最好的方式来处理期望;

简单的解决办法似乎正好赶上任何IOExceptions引发的代码和得到用户的一个"无法进入的文件"的错误信息,但是它可能得到一个位更加详细的错误消息。有没有办法确定之间的差异这样的错误作为一个文件被锁定由另一个程序和数据不可读的,由于硬件的错误?

鉴于下列C#代码,你会怎么处理错误的,在一个友好的用户(如信息尽可能)的方式?

public class IO
{
   public List<string> ReadFile(string path)
   {
      FileInfo file = new FileInfo(path);

      if (!file.Exists)
      {
         throw new FileNotFoundException();
      }

      StreamReader reader = file.OpenText();
      List<string> text = new List<string>();

      while (!reader.EndOfStream)
      {
         text.Add(reader.ReadLine());
      }

      reader.Close();
      reader.Dispose();
      return text;
   }

   public void WriteFile(List<string> text, string path)
   {
      FileInfo file = new FileInfo(path);

      if (!file.Exists)
      {
         throw new FileNotFoundException();
      }

      StreamWriter writer = file.CreateText();

      foreach(string line in text)
      {
         writer.WriteLine(line);
      }

      writer.Flush();
      writer.Close();
      writer.Dispose();
   }
}
有帮助吗?

解决方案

...但是它可能得到一个位更加详细的错误消息。

是的。来吧,抓住 IOException, 和使用 Exception.ToString() 方法,以获得一个比较有关的错误信息,显示。注意,这些例外产生的。净框架将提供这些有用的字符串的,但是如果你都要扔掉自己的例外,你必须记住塞在串入 Exception's构造,如:

throw new FileNotFoundException("File not found");

此外,绝对的,因为每 斯科特曼, 使用, using 发言。事情注意到,虽然,是的 using 声明实际上没有 catch 任何事情,其方式是它应该是。你的测试,看看如果该文件存在,例如,将引入竞争条件可能相反 令人烦恼的.它并不真的你有任何好处,有它在那里。所以,现在,读者,我们有:

try {  
    using (StreamReader reader = file.OpenText()) {  
        // Your processing code here  
    }  
} catch (IOException e) {  
    UI.AlertUserSomehow(e.ToString());  
}

在短期,为基本文件作业:
1.使用 using
2,包的使用说明或功能 try/catchcatches IOException
3.使用 Exception.ToString() 在你 catch 得到一个有用的错误信息
4.不要尝试,以检测出色的文件的问题,你自己。让。净做扔给你。

其他提示

第一件事你应该改变你的电话到StreamWriter和StreamReader到包裹他们在使用的发言,像这样:

using (StreamReader reader = file.OpenText())
{
   List<string> text = new List<string>();
   while (!reader.EndOfStream)
   {
      text.Add(reader.ReadLine());
   }
}

这将需要护理的呼叫密切和处置对于你并将实际上包装在一个试用/最终块,因此实际编码看起来是这样的:

StreamReader reader = file.OpenText();
try
{
   List<string> text = new List<string>();
   while (!reader.EndOfStream)
   {
      text.Add(reader.ReadLine());
   }
}
finally
{
   if (reader != null)
      ((IDisposable)reader).Dispose();
}

这里的好处是,可以确保流被关闭,即使发生异常。

尽任何更明确的例外处理,这真的取决于什么是你希望发生的。在你的例子中,你明确地测试,如果该文件存在与扔FileNotFoundException这可够你用户,但它不可能。

  • 跳过该文件。存在();无论是处理其他地方或让CreateText()/安全()提出。
  • 终端用户通常只在乎如果成功,或者不。如果失败,只是以这样说,他不想详细信息。

我还没有找到一个内置的方式获得的详细信息是什么以及为什么失败。净,但是如果你去地与调用你有成千上万的错误代码可以告诉你发生了什么错误。

我没有看到这点在检查是否存在一个文件和投掷FileNotFoundException有没有消息。该框架将把FileNotFoundException本身,有一个消息。

另一个问题的例子是你应该使用试用/最终模式或所使用的语句,以确保您的一次性类都能得到妥善处理,即使有一个例外。

我会做这个东西就像下,抓住任何例外以外的方法,并显示异常的信息:

public IList<string> ReadFile(string path)
{
    List<string> text = new List<string>();
    using(StreamReader reader = new StreamReader(path))
    {
      while (!reader.EndOfStream)      
      {         
         text.Add(reader.ReadLine());      
      }
    }
    return text;
}

我会使用的用语句简化关的文件。看看 MSDN C#使用的声明

从MSDN:

  using (TextWriter w = File.CreateText("log.txt")) {
     w.WriteLine("This is line one");
     w.WriteLine("This is line two");
  }
  using (TextReader r = File.OpenText("log.txt")) {
     string s;
     while ((s = r.ReadLine()) != null) {
        Console.WriteLine(s);
     }
  }

也许这不是你在找什么,但重新审议这种您使用的例外处理。在第一个例外的处理不应被视为"用户友好",至少只要你想一个程序,为用户。

一笔为,可以下面的文章 http://goit-postal.blogspot.com/2007/03/brief-introduction-to-exception.html .

我会尝试和检查的文件。存在之前呼唤你的读写和响应用户那里,而不是创建的开销,提高一个错误,并抓住它后来由于检查是很容易做到的。我理解需要提高错误,但在这一特别情况下,一个简单的检查恕我直言,将是一个更好的解决方案。我的意思是添加一个多方法,以检查,如果该文件存在。

此外,如果你做的事先检查,如果该文件退出,你知道,别的东西阻塞它如果你不能写。你也可以抓到多例外情况的第一个比赛会被抓的-但你可能知道这个...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top