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

    +20

    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
    #define STR(a) #a
    
    #define EXCEPTION_CLASS_CREATE(a)                   \
    class a : public std::exception                     \
    {                                                   \
    public:                                             \
        a()                                             \
        {                                               \
            d(STR(a)"\n");                              \
        }                                               \
                                                        \
        a(const char * format, ...)                     \
        {                                               \
            char buffer[ 1024 ];                        \
            va_list vl;                                 \
            va_start( vl, format );                     \
            vsnprintf( buffer, sizeof(buffer), format, vl ); \
            va_end( vl );                               \
            _str.append( buffer );                      \
            d(STR(a)" %s\n", buffer);                   \
        }                                               \
                                                        \
        ~a() throw()                                    \
        {                                               \
        }                                               \
                                                        \
        const char* what() const throw()                \
        {                                               \
            return _str.c_str();                        \
        }                                               \
    private:                                            \
        std::string _str;                               \
    };
    // ...
    EXCEPTION_CLASS_CREATE( InternalException )

    Мы очень любим varargs

    Запостил: roman-kashitsyn, 19 Марта 2013

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

    • d == debug_printf?

      В строке 17 у вас ус отклеился поля неровно проведены.
      Ответить
    • Чем EXCEPTION_CLASS_CREATE( InternalException ) проще, чем
      FrooowMyCoolExtseption("InternalExceptio n")?
      Ответить
      • Тем, что он описывает новый класс, который можно будет избирательно ловить catch'ем.
        Ответить
        • Тарас подкинул мне неплохую идею
          template <typename ExceptionType>
          void throw_with_message(const char *fmt, ...)
          {
              char buffer[SIZE];
              // format here
              throw ExceptionType(std::string(buffer));
          }
          // ...
          throw_with_message<InternalException>("Unknown %s", reason);
          Хотя проще написать format, возвращающий std::string
          Ответить
          • на практике boost::system::system_error примерно достаточно на всё
            содержит в себе boost::system::error_code и what
            boost::system::error_code и так везде нужен, при этом, самое главное, позволяет в пользовательские категории и пользовательские коды ошибок
            а если кидать system_error с помощью BOOST_THROW_EXCEPTION можно еще насобирать дополнительной инфы, типа в каком файле на какой строчке кинулось
            Ответить
          • > Хотя проще написать format, возвращающий std::string
            boost::format

            P.S. Походу я перешел на темную сторону ;(
            Ответить
            • у нас много печенек
              Ответить
              • Вот мне надо статистику/менеджмент к приложению прикрутить. Желательно иметь возможность законнектиться с удалённой машины и собирать статистику, строя по ней красивые графики. В жабе есть печенька jmx, там запилитить такое достаточно просто.

                Какие есть варианты с C++? Я пока рассматриваю вариант своего велика с snmp в качестве бэкэнда.
                Ответить
                • ну мои девайсы свою статистику и в виде xml публикуют/засылают куда надо, и snmp есть
                  если статистики на килобайт-десяток, то первый вариант мне нравится гораздо больше, потому что он вообще удобный, да и немало геморроя с поддержкой нашей snmp под виндой (писано не мной, я вообще со страхом думаю, если там надо будет что-то править когда-нибудь), и snmp должен быть привязан к чему-либо, что хранит конкретные значения (реестр, например)
                  если статистики куча, то надо думать
                  в любом случае, я не припомню готового решения где нибудь в бусте - это лисапед так или иначе будет, либо 3rd party не факт что удобная
                  Ответить
                  • в принципе не так давно писал прослойку между реестром/xml-заменителем реестра (под линух, у нас там нет даже dbus) с единым удобным интерфейсом, в т.ч. удаленным доступом, нотификацией, управлялось это всё более-менее прозрачно в виде
                    mystat.foo.bar.counter = 200;
                    myregistry.merge(mystat.foo);
                    myregistry.load(mystat.baz);
                    if (mystat.baz.name == "Hello, Jim")
                       myregistry.listen("/path/to/key/", boost::bind(&bar::on_registry_updated, ...));
                    так что могу дать советы
                    Ответить
                    • Мне самому, честно говоря, связываться с snmp совсем не хочется, не лежит у меня душа к нетривиальным бинарным форматам. Вторая мысль была пересылать данные в какой-нибудь человеко-читаемой разметке json/xml, как у тебя сделано, но тогда придётся писать и читалку соответствующую, а для snmp вроде уже есть готовые инструменты. В любом случае, реальный опыт применения не помешает.
                      Ответить
                      • что для snmp придется настраивать/хардкодить oid, что для xml селектить xpath (лучше, конечно, парсить целиком и апдейтить бд)
                        Ответить

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