1. C++ / Говнокод #5599

    +161

    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
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    // Часть первая. Объявления. Exceptions.hpp
    
    template <typename E>
    struct ExeptionKeeper 
    {
        E * exptn;
        ExeptionKeeper(E * ex) 
        {
            exptn = ex;
        }
        ~ExeptionKeeper()
        {
            if(exptn != NULL )
            {
                delete exptn;
            }
        }
        E * operator -> () 
        { 
            return exptn; 
        }
    };
    
    #define EX_TRY(XX) try { XX }
    #define EX_CATCH(TT, NAME, XX) catch (TT *_ex) { ExeptionKeeper<TT> NAME(_ex);  XX }
    
    /// Часть вторая. Использование. ModelsHelper.cpp
    
    .... // код
            EX_TRY
            (
               ............
                 TestParams(args); // кидает new ParamsException в случае неудачи
               ............
                 TestFunctions(funclist); // Кидает new FuncsException ... 
               ............
               //// тут еще есть вызовы, кидающие исключения
               ............
            ) 
            EX_CATCH
            (   ParamsException, exp,
                GLogger(levelerror).Log("Invalid params for model ", exp->model(), " [", exp->paramlist().str(), "]");
            ) 
            EX_CATCH
            (   FuncsException, exp,
                GLogger(levelerror).Log("Invalid functions for model ", exp->model(), " [", exp->funclist().str(), "]");
            ) 
            EX_CATCH
            (   LevelsException, exp,
                GLogger(levelerror).Log("Invalid levels for model ", exp->model(), " [", exp->levelslist().str(), "]");           
            ) 
            EX_CATCH
            (    .... , exp,
                ........
            )
    .... // код

    И снова на тему исключений.
    Прислал приятель. Какой-то софт для аэропортов.
    Комменты на русском мои.

    Запостил: ossa, 09 Февраля 2011

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

    • > Exception
      хорошо, что не Exepshon
      Ответить
    • особенно использование препроцессора это круто
      Ответить
    • у меня на лице выросли пальмы
      Ответить
    • Ну что тут можно сказать... Говнокодом является бросание исключений в стиле `throw new`, т.е. бросение непосредственно динамически аллоцированных объектов. А все остальное - это лишь извращения, которые волей-неволей приходится применять тогда, когда кто-то таки бросает исключения в стиле `throw new`.

      Поэтому то, что Вы привели тут - это само по себе еще никак не говнокод. Есть к чему придраться, конечно, но это не корень проблемы. Корень проблемы - это тот говнокодер, который кидает `throw new`. Если за `throw new` ответственен другой "аффтар", то на этот код вы наезжаете во многом зря. Автор этого кода - лиштьневинная жертва, которая лишь "вертится как умеет".
      Ответить

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