1. Java / Говнокод #16245

    +70

    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
    public class MyFancyException extends Exception {
        
        public MyFancyException(Throwable cause) {
            super(cause);
        }
        
        static public <X extends Throwable> void foo() throws X {
            try {
                throw new MyFancyException(new Exception());
            }
            catch (MyFancyException ex) {
                throw (X) ex.getCause();
            }
        }
        
        
        public static void main(String[] args) throws IOException {
            MyFancyException.<IOException>foo();
        }
    }

    Прекрасный способ отстрелить себе ногу. Метод foo() может кинуть любое исключение, даже если его нет в списке throws

    Запостил: aspid812, 27 Июня 2014

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

    • static public
      это что-то из JDK 1.10 ?
      Ответить
    • Известный хак, но неряшливо сделан.
      >Прекрасный способ отстрелить себе ногу.
      Компилятор предупреждает об этом в строке 12.
      Ответить
      • А вот кресторантайм за выброс исключения из функции, помеченной как throw () (т.е. "не бросающая исключений"), убивает прогу наповал :)
        Ответить
        • Рантайм — функции: «Ты ж говорила, что исключений не бросаешь. Ты что пиздишь? На, нах, ёбта»
          Ответить
        • Знаем. Обсуждалось недавно.
          Ответить
          • > А как же новый noexcept?
            Тоже убивает (я думал, что он в compile-time сматерится - но нет, доверяет и убивает лжецов). Но noexcept можно в compile-time проверить и замутить какую-нибудь оптимизацию на основе этого обещания (см. коммент про вектор выше).
            Ответить
    • Поясните дураку^W дотнетчику - нах вся эта суета типа throws IOException?
      Ответить
      • Неудачный эксперимент жавопроектировщиков, вылившийся в годы обратной совместимости...

        Идея может быть и неплохая, но она очень плохо работает с паттернами типа visitor'а (можешь в моей кабинке поискать, есть пример). А во-вторых эту систему жутко абузили, и заставляли ловить все подряд. Например тот же JSONException при генерации json'а, который нахуй никому не сдался.
        Ответить
        • Типа контракт на допустимые исключения? херня какая то
          Ответить
          • > Типа контракт на допустимые исключения?
            Тип того. Но оно еще и заставляет их ловить или добавлять в throws вызвавшей функции. В этом и основная трабла ;)

            В крестах, кстати, такая фишка тоже была, но ее объявили устаревшей, и замутили вместо нее маркер noexcept, показывающий, что функция никогда и ничего не должна бросать.
            Ответить
            • а если бросает - сразу об пол, об пол...

              Запрет исключения звучит разумнее, но, мне кажется, это больше похоже на пометку для программиста чем на реальный инструмент
              Ответить
              • > это больше похоже на пометку для программиста
                throw () было просто пометкой. Можно было прям в ней написать throw и самоубиться :)
                Ответить
              • > на пометку для программиста
                Не только. noexcept еще для оптимизаций используется. Например, если конструктор перемещения обещает не кидать исключений (помечен как noexcept), то вектор будет перемещать элементы в новый буфер при реаллоке, иначе - копировать в новый буфер а затем удалять старые.

                А за нарушение обещания - смерть.
                Ответить
                • звучит разумно. все это магия С++ 11
                  Ответить
                • >А за нарушение обещания - смерть.

                  Прям тюремные понятия: не держишь слово? Опустят или на нож.

                  Не тот язык назвали «решёткой»
                  Ответить
                  • Парни, вы не заметили - большая часть аватарок бабские, а баб нету
                    Ответить
                    • > Парни, вы не заметили - большая часть аватарок бабские, а баб нету
                      Ты что-то имеешь против бабских аватарок? ^_^
                      Ответить
      • чтоб еще на этапе компиляции ловить анхендлед екзепшны
        Ответить
    • Vanished
      Ответить
    • Олег взвился. Он влепил парню ещё одну пощёчину и левой рукой заломил руку парня за спину, а правой, оттягивая его волосы назад, потащил Ромку в подвал.
      Ответить
    • - Полтора месяца, - виноватым голосом ответила она.
      Ответить

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