2012-01-23 69 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塊中。因人而異。