写入文件实现

时间:2012-01-23 09:26:14

标签: c# .net

我只想在这里学习一些关于我的代码的新内容。

我有以下功能,如果我在写入文件时遇到问题,它是否是优化的返回方式?或者有一种更好的方式......

public static bool WriteFile(ByteBuffer data  , String fileName, bool append)
        {
            var writer = new StreamWriter(fileName, append);
            var errorVal = true;
            try
            {
                writer.Write(data);
                writer.Flush();
            }
            catch (Exception ex)
            {

                errorVal = false;
            }
            finally
            {
                writer.Dispose();
            }

            return errorVal;
        }

5 个答案:

答案 0 :(得分:4)

如果真的想要吃掉所有异常而只返回bool,我宁愿这样做:

public static bool WriteFile(ByteBuffer data, String fileName, bool append)
{
    using(var writer = new StreamWriter(fileName, append))
    {
        try
        {
            writer.Write(data);
            return true;
        }
        catch (Exception ex)
        {
            // log the exception details; don't just eat it.
        }
    }
    return false;
}

那就是说,如果它是我自己的代码,我可能根本就没有在这里捕获异常,而是将其留给调用代码:

public static void WriteFile(ByteBuffer data, String fileName, bool append)
{
    using(var writer = new StreamWriter(fileName, append))
    {
        writer.Write(data);
    }
}

答案 1 :(得分:2)

最好让它将异常抛出到应用程序层结构中的顶层。

public static void WriteFile(ByteBuffer data  , String fileName, bool append) throws Exception
        {
            var writer = new StreamWriter(fileName, append);

                writer.Write(data);
                writer.Flush();

                writer.Dispose();
        }

答案 2 :(得分:1)

我认为您应该始终对实现using(...)接口的每个对象使用IDisposable,因此您可以确保它在超出范围时将被处置。

public static bool WriteFile(ByteBuffer data, String fileName, bool append)
{
    using (StreamWriter writer = new StreamWriter(fileName, append))
    {
         try
         {
              writer.Write(data);
              writer.Flush();
              return true;
         }
         catch (Exception ex) 
         { 
             // Do domething here, maybe log ex.Message
         }
    }
    return false;
}

答案 3 :(得分:0)

我建议删除代码

Exception ex

来自catch部分

答案 4 :(得分:0)

我同意其他人所说的关于处理更高级别的异常并让它们冒泡的问题。

如果你真的“必须”在这里处理它们并且只返回true或false,请注意到目前为止所有其他解决方案都无法捕获打开/创建文件时可能发生的异常。

另请注意,我仍然会遇到只捕获那些实际记录为可能发生的异常的麻烦。

为此,您需要将StreamWriter构造函数放在try块中:

public static bool WriteFile(ByteBuffer data, string fileName, bool append)
{
  StreamWriter writer = null;
  Exception exception = null;

  try
  {
     writer = new StreamWriter(fileName, append);
     writer.Write(data);
  }
  catch (UnauthorizedAccessException ex)
  {
     exception = ex;
  }
  catch (SecurityException ex)
  {
     exception = ex;
  }
  catch (IOException ex)
  {
     exception = ex;
  }
  finally
  {
     if (writer != null)
     {
        try {
           writer.Close();
        } catch (EncoderFallbackException) { /* arguably log this as well */ }
     }

     if (exception != null)
     {
        // Log exception
        return false;
     }

     return true;
  }
}

请注意,他们还有其他两种方法可以实现相同的行为;包括使用using块或注释缓存异常并将其记录在finally中,但直接记录在相应的catch块中。 YMMV。