2012-01-23 2 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

+1 особенно для 'using()' StreamWriter. – Filburt

0

Я предлагаю удалить код

Exception ex 

из улова раздела

+0

Почему? Улавливать еще больше (нежелательных) или коррупционных состояний (в .NET до 4,0) исключения? –

+0

Он не использует объект ex – zzfima

+0

Yup, но он должен. А также существует значительная разница между '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. YMMV.