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

    +17

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    ~Guard(){
      if(std::uncaught_exception())
        try{
        }catch(...){
          error_output<<"prevented exception!!!"<<endl;
        };
    }

    Запостил: LispGovno, 03 Июня 2014

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

    • Что ехидного сказать автору?
      Ответить
    • Сегодня я узнал про std::uncaught_exception()
      Ответить
      • И о его бесполезности?
        Ответить
        • Я пока не размышлял над этим.
          Ответить
        • А почему стек не раскручивается, если нет блока try? оптимизация?

          Вот, к примеру: http://ideone.com/F0YXTz
          Ответить
          • 15.3/9: If no matching handler is found in a program, the function terminate() is called; whether or not the stack is unwound before this call to terminate() is implementation-defined (15.5.1).

            > оптимизация?
            Скорее всего деталь реализации unwinder'а - сначала ищет докуда отмотать, а потом отматывает. А раз исключение не ловят - тупо вызывает terminate положив на все хуй.
            Ответить
          • P.S. Кажется понял, нахрена так делают... Если стек размотать перед вызовом terminate(), то core dump получится неюзабельным и пустым.
            Ответить
            • $ gdb a.out core
              <...>
              (gdb) backtrace
              <...>
              #5  0x00007f79c21d4aa2 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
              #6  0x0000000000400f09 in riskyThing () at 1.cpp:40
              #7  0x0000000000400f61 in foo () at 1.cpp:46
              #8  0x0000000000400d99 in main () at 1.cpp:50
              Ответить
              • суровый плюсовый стектрейс
                Ответить
                • > суровый плюсовый стектрейс
                  Да вполне читабельный. Жопа в том, что в рантайме подобный трейс для пойманного исключения не получить ;( Для своих то можно, а вот для других библиотек - фиг.

                  - Покажи бектрейс исключения, пожалуйста.
                  - Только через мой труп!
                  Ответить
            • Да уж, выходит веселье со всякими разделяемыми внешними ресурсами (типа сети).
              Ответить
              • Никакого веселья. Трайкетш вставьте в корень.
                Ответить
              • Да сокеты то сами отвалятся, с этим никаких проблем. А если прога на том конце не умеет на это адекватно реагировать - это плохая прога. И файлы закроются. Вроде бы единственное, что можно повредить - межпроцессные семафоры и расшаренную память (да и то вроде бы были способы восстановиться после этой ситуации).

                Ну и как выше пишет laMer007 - можно вставить try в main'е и обработать исключение самому.
                Ответить
                • ну не только в маин, но и в свой врапер потока возможно
                  Ответить
                  • А там вроде как уже есть, чтобы прога не дохла при исключении в треде.
                    Ответить
                    • А что поток должен сделать, если поймал не пойманное исключение? Разве не terminate? Так что скорее всего нет.
                      Ответить
                      • > Разве не terminate?
                        В крестах нет потоков.

                        Вечером почитаю, что на этот счет думает стандарт с++11. Но вроде бы не terminate.
                        Ответить
                        • > В крестах нет потоков.
                          Доведи шутку до конца. А что там? Зеки?
                          Ответить
                          • В современных крестах есть как минимум заборы.
                            Ответить
                      • >что поток должен сделать, если поймал не пойманное исключение
                        std::abort?
                        Ответить
    • Гыгы. Он ещё и горе оптимизатор. Забыл что catch вызывается только при исключении и проверять через std::uncaught_exception не нужно.
      Ответить
    • Я правильно понял, что этот деструктор (по задумке?) вызовется в процессе "всплывания" исключения и волшебным образом не даст исключению всплыть на уровень выше себя?
      Ответить
      • Да.
        Ответить
      • > деструктор вызовется в процессе "всплывания" исключения
        Да - если исключение поймают где-то выше по стеку.
        Нет - если никто не захочет его обрабатывать.

        > волшебным образом не даст исключению всплыть
        catch в 4й строке никогда не сработает. Так что весь код декоративный, не более того.
        Ответить
        • Ну вот потому и дописал "по задумке". Спасибо что пояснил.
          И чего аффтару в try-catch не обернулось...
          Ответить
          • Да, автору самому впору обернутся в трайкетч, ловя и сдерживая свои позывы к говнокодингу
            Ответить
    • Я лег рядом и отвернулся. Отчего-то на глаза навернулись слезы. "Что это я как баба," - возникла мысль, а слезы уже бежали по щекам, горло перехватило, я хлюпнул носом, что вызвало интерес Пашки.
      Ответить

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