Школоло / Говнокод #4673 Ссылка на оригинал

0

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

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

Запостил: stokito stokito, (Updated )

Комментарии (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' автоматически? полезнее адреса будет.
      Ответить
      • особенно это полезно когда у вас скомпилированный код без дебаг символов
        Ответить

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

Из-за тебя ушел bormand, guest!

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


    8