1. Pascal / Говнокод #4673

    +145

    1. 1
    2. 2
    if not Assigned(ArbPower) then
          DoException('Блятство');

    эмокод, но какой душевный!

    Запостил: stokito, 18 Ноября 2010

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

    • на заре профессиональной деятельности у меня самого был код, где было написано что-то вроде: ShowMessage('Гав-гав!'); в реальном проекте, но правда в тестовом коде, который не запускался. Но, как известно, раз в год стреляет и незаряженное ружье.
      У одного моего знакомого было что-то вроде ShowMessage('Не имеешь правов таких, покажи лицензию!');
      короче, аффтар не одинок:)
      Ответить
    • Я и раньше не особо баловался вальяжными сообщениями пользователю, со временем выработался вообще жёсткий рефлекс не писать.
      Этот код я переписал:
      Assert(Assigned(ArbPower));
      Ответить
      • да и тем, кто так делает, одного начальственного пинка хватает, чтобы отучиться:)
        Ответить
    • говно, но не здесь. аффтар проебывает как класс ошибки так и её адрес:
      procedure DoException(const Message: string);
        function ReturnAddr(): Pointer; platform;
        asm
          { отчаянная платформ-специфическая попытка вытащить адрес возврата из стека }
        end
      begin
        if Message = 'Блятство' then raise EBljad.CreateFmt('бля! по адресу %p', [ReturnAddr()])
        else if Message = 'Хуятство' then raise EXyu.CreateFmt('хуй по адресу %p', [ReturnAddr()])
        else raise EPizdec.CreateFmt('полный пиздец по адресу %p', [ReturnAddr()]);
      end;

      типа того. а маты в сырцах это банально.
      Ответить
      • {я не писал на паскале 10 лет, извините}
        case Err of
        'Блятство': DoProcessBljadstvo;
        'Хуятство': DoProcessHujatstvo;
        end;
        {или свича по строкам не бывает?}
        Ответить
        • не бывает, и адрес еще глубже протерян оказался
          и вообще, префикс Do это для делегатов
          Ответить
      • ты прав, я сразу как увидел DoException пометил его deprecated:
        procedure DoException(const Msg: string); deprecated;
        begin
          //TODO : Использовать православный raise Exception.Create;
          raise Exception.Create(Msg);
        end;
        
        procedure DoException(const Msg: string; const Args: array of const); deprecated;
        begin
          //TODO : Использовать православный raise Exception.CreateFmt;
          raise Exception.CreateFmt(Msg, Args);
        end;


        Но в любом случае в этом проекте проблема не очень актуальна, ибо стек вызова всё равно есть (спасибо EurekaLog).
        Ответить
      • Можно еще получить имя класса (это всегда можно) и имя published метода из которого это вызвалось (а это уже только для published методов), где требуется выкинуть эксепшон.
        Кстати, в дельфи можно генерить в строке что-то типа: 'modulename.pas, line NNN' автоматически? полезнее адреса будет.
        Ответить
        • особенно это полезно когда у вас скомпилированный код без дебаг символов
          Ответить

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