写入文件实现

本文关键字:实现 文件 | 更新日期: 2023-09-27 18:21:12

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

我有以下函数,如果我在写入文件时遇到问题,这是优化的返回方式吗?或者有更好的方法

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;
        }

写入文件实现

如果真的想要吃掉所有异常并返回一个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);
    }
}

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

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();
        }

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

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;
}

我建议删除代码

Exception ex

从捕获段

我同意其他人所说的,在更高级别上处理异常,让它们冒出来。

如果您真的"必须"在这里处理它们,并且只返回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。