2012-01-23 31 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を 'using()'する場合は+1してください。 – Filburt

0

私はそれはあなたの中で最上層に例外を投げるようにする方が良いキャッチセクション

+0

なぜですか?より多くの(望ましくない)または状態の破損(4.0より前の.NETでは少なくとも)例外をキャッチするには? –

+0

彼はexオブジェクト – zzfima

+0

Yupを使用しませんが、彼はすべきです。また、catchとcatch(Exception)の間には大きな違いがあります。 –

2

からコード

Exception ex 

を削除示唆アプリケーションの多層アーキテクチャをサポートします。

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

私はあなたが常にを使用すべきだと思います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を返すだけであれば、これまでの他のすべてのソリューションは、ファイルのオープン/作成時に発生する可能性のある例外をキャッチできません。

また、実際に発生する可能性があるものとして実際に文書化されている例外をキャッチするという面倒を見ています。そうするには

、あなたにもtryブロックでStreamWriterコンストラクタを配置する必要があります。同じ動作を実現するために、他のいくつかの方法が自分であることを

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。

関連する問題