2012-01-23 42 views
2

我只想在这里了解一些关于我的代码的新东西。写入文件执行

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

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

也许你可以为更具体的错误添加一些更具体的异常类型。 – Lobo

+0

@Lobo我只需要知道,我有一个虚假返回的异常,并没有真正处理它们。 –

+0

在这种情况下,如果你只需要一个布尔结果,那么我看到了这个函数。但最好知道什么样的例外和原因。 – Lobo

回答

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); 
    } 
} 
+0

特别针对'使用()'StreamWriter。 – Filburt

0

我建议从闭锁段删除代码

Exception ex 

+0

这是为什么?捕捉更多(不需要)或状态破坏(至少在.NET 4.0之前)异常? –

+0

他不使用前物体 – zzfima

+0

是的,但他应该。 'catch'和'catch(Exception)'之间也有明显的区别。 –

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(); 
     } 
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; 
} 
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块中。因人而异。