1. C# / Говнокод #19039

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    public class Logger
    	{
    		public static string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.log");
    
    		public static void Write(string message)
    		{
    			using (var sw = File.AppendText(filePath))
    			{
    				sw.WriteLine(DateTime.Now);
    				sw.WriteLine(message);
    				sw.WriteLine();
    				sw.Flush();
    			}
    		}
    
    		public static void Write(Exception exception)
    		{
    			using (var sw = File.AppendText(filePath))
    			{
    				sw.WriteLine(DateTime.Now);
    				sw.WriteLine("ERROR:");
    				sw.WriteLine(exception.Message);
    				sw.WriteLine(exception.StackTrace);
    				sw.WriteLine();
    				sw.Flush();
    			}
    		}
    	}

    Нафига готовые решения? Вот - образец велосипедостроения! (И, тссс! Не вздумайте использовать его в многопоточной среде ;) А именно там он и используется по факту :) )

    PS угадайте какой фортель выкинет сеё чудо при race condition

    Запостил: leon_mz, 18 Ноября 2015

    Комментарии (20) RSS

    • Выкинет UnauthorizedAccessException потому что файл уже занят?
      Ответить
      • К сожалению нет. Банально теряет или полностью либо частично содержимое Stream-а "проигравшего" потока.
        Ответить
        • Почему? Тут же файл открывается в append моде?
          Ответить
          • Потому что рейс кондишен на беззащитном буфере, видимо.
            Ответить
            • А про какой буфер речь?
              Ответить
              • Про буфер железнодорожного вагона. Видать, зацепер на нём совершил целый рейс.
                Ответить
              • Ну раз оно не кидает исключение, что файл занят - походу, как-то оптимизирует. Например открывает файл один раз и обе записи летят в один буфер и в один хендл... Ну либо дважды пишет в файл с одного и того же оффсета. У меня вот такое предположение было.
                Ответить
              • Про беззащитные сиськи (буфера).
                Ответить
    • синглтон, мютекс и с пивом пойдет
      Ответить
      • А в жабе вообще одним словом synchronized решилось бы ;)
        Ответить
        • в решеточке есть "lock"
          Ответить
          • ... stock and barrel
            Ответить
            • Вот тебе человекочитаемый url: https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
              Ответить
              • Вот тебе человекочитаемый url без сахара:https://msdn.microsoft.com/ru-ru/library/de0542zz(v=vs.110).aspx
                Ответить
                • Вот тебе урл со щепоткой соли: http://x86.renejeschke.de/html/file_module_x86_id_159.html
                  Ответить
    • И Flush не нужен. Если бы поток был открыт постоянно, а так Close все равно вызовется при выходе из блока using.
      Ответить
      • По идее нужен. Flush может выкинуть эксепшн, который Close проглотит. Помнится тут такое говно в java.io. Да в LKML тоже был срач
        Ответить
    • Так че тут? Навешать лок и в продакшен! На нах епта.
      Ответить

    Добавить комментарий