Кресты / Говнокод #16106 Ссылка на оригинал

0

  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 LispGovno, (Updated )

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

        • 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 не обернулось...
        Ответить
  • Я лег рядом и отвернулся. Отчего-то на глаза навернулись слезы. "Что это я как баба," - возникла мысль, а слезы уже бежали по щекам, горло перехватило, я хлюпнул носом, что вызвало интерес Пашки.
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8