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

    +2

    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
    #include <iostream>
    #include <stdexcept>
    
    using namespace std;
    
    class Exception : std::runtime_error
    {
    public:
        Exception( std::string const & what ) : std::runtime_error(what)
        {
        }
    };
    
    int main( )
    {
        try
        {
            throw Exception("Exception");
        }
        catch ( std::exception const & e )
        {
            std::cerr << e.what() << std::endl;
        }
        catch(...)
        {
            std::cerr << "..." << std::endl;
        }
        return 0;
    }

    Запостил: laMer007, 08 Июля 2016

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

    • #struct
      Ответить
      • #using std::runtime_error::runtime_error;
        Ответить
        • Что ты этим пытался сказать? Я хотел сказать, что по заветам создателей boost::exception рекомендовано для исключений юзать struct вместо class
          Ответить
          • Вдобавок вместо переопределения конструктора, который будет всего лишь вызывать родительский, можно просто сделать конструкторы родителей видимыми.
            Ответить
            • При публичном наследовании если ты конструктора не трогаешь, то и юзинг не нужен
              Ответить
    • А вот нехуй было приватно наследоваться...
      Ответить
      • З.Ы. Он считал себя Наполеоном, но для всех остальных он был просто Васей из шестой палаты.
        Ответить
      • где здесь приватное наследование?
        Ответить
        • class Exception : std::runtime_error
          Ничего не указано - значит private (для class) или public (для struct).
          Ответить
          • Обожаю кресты за 1000 неявных правил и 100500 ебанутых крестоблядских исключений из этих правил.
            Ответить
    • что выводит код?
      Ответить
      • http://ideone.com/DSSL1b
        Ответить
        • ронтайм еррор наследуется от эксептион?
          Ответить
          • Да.

            http://ideone.com/Qn1NMC
            Ответить
            • а почему так происходит?
              в чем разница?
              Ответить
              • Приватное/публичное наследование
                Ответить
              • См. выше про Наполеона ;)

                Класс считает себя наследником runtime_error, но для остальных он просто Exception - ни кастануть в runtime_erorr ни поюзать унаследованные от него члены они не могут.
                Ответить
                • А если protected наследование, то то, что он Наполеон, это тщательно охраняемый семейный секрет, передаваемый из поколения в поколение.
                  Ответить
                  • А ещё можно раскрыть эту тайну друзьям.
                    Ответить
                • Где купить "C++ для поехавших и поступающих в психбольницы"? Первая книга серии есть, а вот эту никак не найду.
                  Ответить
                  • Она под другим названием издаётся: Modern C++ Design: Generic Programming and Design Patterns Applied
                    Ответить
    • главный вопрос: а зачем вообще наследоваться?
      Ответить
      • Иерархия исключений, чтобы можно было бы ловить исключения через std::exception и логировать what(), а не ловить ... и логировать хуй.
        Ответить
        • Я про то, что наследуемый класс тут нинужен. Ничто же не мешает написать throw std::runtime_error("error text");
          Ответить
          • В реальном коде может возникнуть необходимость отличать исключения разных типов. Это кусок какого-то кода вырванный из контекста.
            Ответить
          • Даже если в данный момент тебе не надо отличать какую-то конкретную ошибку, это не повод кидаться рантайм еррорами - лучше сразу спроектировать нормальную иерархию исключений. А то потом еще будешь what() парсить.
            Ответить
            • у меня есть (возможно, вредная) привычка докидывать инфу к what: аля
              MyException(std::string s) : std::runtime_error("MyError occured: "+ s) {}
              Здесь же я отличий наследника от предка не увидел
              Ответить
              • > Здесь же я отличий наследника от предка не увидел
                А они и не обязаны быть. Хороший пример того, о чём говорит kurwa - напитоне:
                try:
                    doSomethingDangerous()
                except TypeError:
                    print('У вас ошибка в типах!')
                except ValueError:
                    print('У вас ошибка в значениях!')
                except ZeroDivisionError:
                    print('Вы поделили на ноль!')
                except Exception:
                    print('Произошла какая-то другая хуйня!')

                При этом TypeError, ValueError и иже с ними не обязаны отличаться от предка (Exception) чем-либо, кроме типа.
                Ответить
              • Сообщение в исключении для людей, а не для парсинга софтом.
                Ответить
                • > Сообщение в исключении для людей, а не для парсинга софтом.
                  Жаль не все об этом знают...
                  Ответить
                • я и не предлагаю парсить. Без лишних заморочек напечатать в каком модуле ошибка. Плохо чтоли?
                  Ответить

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