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

    +9

    1. 1
    2. 2
    3. 3
    HRESULT hr = ReadGenericXMLFile(srcStorage, pagePath, result);
      if (hr == S_FALSE) return STG_E_FILENOTFOUND;  // File must exist
      if (FAILED(hr)) return hr;

    Могу понять, обратное, когда вызывающая функция просто возвращает "false" при любом неудачном вызове внутренней функции: нет файла / нет доступа / runtime error и т.д. Здесь же наоборот, при "общем" неудачном вызове внутренней функции возвращается "конкретное" сообщение об ошибке.

    Запостил: Fogbit, 25 Июля 2013

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

    • > Могу понять, обратное, когда вызывающая функция просто возвращает "false" при любом неудачном вызове внутренней функции

      А как будете узнавать, какая же именно ошибка случилась? using std::telepathy?
      Ответить
      • > А как будете узнавать, какая же именно ошибка случилась?
        По логам например.

        Fogbot же не поощряет такую практику. Он просто говорит, что возврат false в случае любой ошибки более вменяем, чем возврат FILENOTFOUND в случае хрен знает какой ошибки. Да, false само по себе не даст понять причину ошибки. Но оно хотя бы не введет в заблуждение - пользователю очень весло будет смотреть на сообщение "файл не найден" на битом файле, и еще и еще раз пытаться скормить его программе...

        P.S. Total Commander, емнип, при запуске экзешки при любом фейле выдавал то самое "Файл не найден". И меня это жутко бесило. Лучше уж "неизвестная ошибка при запуске" чем так.
        Ответить
        • В тотале очень хреновая обработка ошибок. Там 100 пудов 2 состояния - ок и не ок.

          Продолжим старую тему - а куда с него валить? Только не говорите про фар, кококонсолечка была моветоном в конце 90х, а сейчас - тем более.
          Ответить
          • Я тут на днях записал обучалку по dired - если сильно интересно. (еще не всю записал, осталось две нераскрытые темы)
            Ответить
            • >dired
              Чтоэта?
              Ответить
              • Плагин к ёмаксу.
                Ответить
                • Я видел плагин к емаксу, который вибратором управлял, наверно, чтобы чувствовать тугую консолечку в срачле. http://www.youtube.com/watch?v=D1sXuHnf_lo
                  Ответить
                  • Например, можно запустить конпеляцию ядра, а когда она закончится - получить настоящий кайф. Или использовать в играх, типа как джойстик с отдачей.
                    Ответить
              • http://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html
                Ответить
          • с чего бы вдруг моветоном?
            смени себе шрифт на нормальный трутайп - ту же люсиду хотя бы, поставь размер удобный, установи размер окна, чтобы почти на весь рабочий стол, домешай плагинов (хотя второй фар и так нормален, ты же не собрался в нем же и код писать?) - и вот ты получил возможностей на порядок больше, чем убогий мышкоюзерный тотал коммандер
            и работает быстро
            тебе рюшечки нужны или рабочий инструмент?
            Ответить
            • >чем убогий мышкоюзерный тотал коммандер
              консолечный мышкоюзерный же фар, только еще и консолечный.

              >работает быстро
              Типа тотал тормозил?
              Ответить
              • насколько я помню, у тотала обыденные проблемы открывать десятимегабайтные текстовые файлы, он даже не может в режиме просмотра лог-файла присосаться в его конец, как tail -f
                но я не юзал никогда, только видел на компе у сотрудника
                там чуть ли не notepad вызывается для просмотра, да?
                Ответить
                • > там чуть ли не notepad вызывается для просмотра, да?
                  Как настроишь. Встроенный lister или любая внешняя прога.

                  > проблемы открывать десятимегабайтные текстовые файлы
                  Не знаю, когда юзал - никаких проблем с большими файлами не было. А открывал им иногда и по 2 гига и по 4.
                  Ответить
                • > как tail -f
                  А вот тут как раз фар его рвет. Не знаю конечно, может в новых тоталах и запилили эту фишку, но старый, если я конечно не туплю, так не умел.
                  Ответить
                  • f3 - end?
                    Ответить
                    • А я чет запамятовал, листер после этого сам обновляется, если в файл что-то дописали?
                      Ответить
                      • Он вроде бы обновляется при перемотке, всегда можно обновить, нажав N (следующий файл - если файл один, он перезагружается).
                        Ответить
                        • Ну просто в фаре мне нравится фишка - открываешь файл на просмотр, жмешь end, и он сам, без нажатий клавиш, скроллится по мере появления новых записей в файле. Например в процессе отладки можно отложить окошко в сторону, и поглядывать на новые записи в лог... Собственно работает как tail -f в линухе. Удобно.
                          Ответить
                • Да ты упорот. Встроенный листер по f3 открывает что угодно.
                  >но я не юзал никогда, только видел на компе у сотрудника
                  Не читал, но осуждаю.
                  Ответить
                  • вот этому сотруднику приходилось какой то левый плагин ставить и живые текстовые логи смотреть в дополнительном всплывающем окне
                    что там ваш встроенный листер обновляет при перемотке я не знаю, приходится телодвижения делать, чтобы посмотреть что в файл добавилось?
                    Ответить
                    • Ага, причем дохуя. N -> End. Не за что.
                      Ответить
                      • Если окошко, в котором я смотрю логи, не в фокусе, а закинуто куда-нибудь на второй моник или в угол экрана - то очень дохуя.

                        Или ты делаешь какой-нибудь запрос к серваку, и сразу, без телодвижений, видишь новую запись в логе. Или тебе надо перефокусировать окно, нажать N, нажать End, вернуться к клиенту и так далее. Что из этого удобней? :)
                        Ответить
                        • А что, фар умеет показывать конец обновляемого файла?
                          Ответить
                          • > А что, фар умеет показывать конец обновляемого файла?
                            Да, просто нажимаешь end, и он подвешивается к концу файла, прокручивая вывод при появлении новой инфы.

                            > А как фар и tail следят за обновлением файла?
                            Точно не знаю, но скорее всего просто раз в секунду пытаются прочесть файл с последнего офсета. Если что-то прочиталось - выводят, и продолжают попытки уже с нового места.
                            Ответить
                            • А как оно будет себя вести при перезаписи файла?
                              Ответить
                              • нормально, покажет новое содержимое - N последних строк, сколько влезает в окно
                                Ответить
                                • Хм. Т.е. на уменьшение файла он тоже адекватно реагирует? Никогда не пробовал, если честно ;)
                                  Ответить
        • > По логам например.
          > Да, false само по себе не даст понять причину ошибки.
          В лог надо что-то же записать. А как определить, что именно зафейлило, если в качестве сигнала об ошибке приходит просто "ошибко"? Разве что GetLastError-подобными методами, что тоже не шибко удобно. Или я чего-то не знаю?

          А когда прога на все фейлы выдает "файл не найден" - проблема скорее в криворучии автора, в силу его лени не придавшего значения таким ситуациям.
          Ответить
          • > А как определить, что именно зафейлило, если в качестве сигнала об ошибке приходит просто "ошибко"?
            Адекватное сообщение в духе "Файл /home/xxx/hui.dat не найден" можно выдать только в той функции, которая знала, какой файл пытались открыть. И если она это не сделает, а просто передаст код на уровень выше - этот код может стать настолько же бесполезным, насколько и ненавистное вам false. Программа будет выдавать идиотское "Файл не найден", которое никак не поможет пользователю. Но да, код ошибки по сравнению с false удобней для программы в том плане, что она может адекватней отреагировать на ошибку, и попытаться как-то устранить ее причины.

            > В лог надо что-то же записать.
            А я пишу в логи. Много пишу. И ни разу еще об этом не пожалел. Во время разбора полетов логи за вчерашний-позавчерашний день часто оказываются ценнее, чем нынешние сообщения об ошибках.

            P.S. Вы видимо не дочитали мой коммент до конца? Ок, повторю пропущенную вами мысль: Здесь никто не говорит, что возвращать false хорошо. Я и Fogbit утверждали лишь то, что возвращать false или UNKNOWN_ERROR вменяемее, чем возвращать FILE_NOT_FOUND вместо корректного кода ошибки. Неправильный код ошибки вводит пользователя в заблуждение, а это намного хуже, чем отсутствие инфы, которое дают нам false и unknown error. С этим, надеюсь, вы не будете спорить?
            Ответить
            • > P.S. <...>
              Видимо, я тогда недопонял ваши идеи до конца. Теперь все стало по местам.

              P.S: логи и я пишу. Лишь хотел уточнить, что в лог нужно писать полезную инфу, которую перед тем надо подготовить.
              Ответить
      • Такая схема не предполагает конечным юзером знание какая конкретно ошибка случилась. Ему просто выдаётся что инициализация стороннего компонента закончилась неудачно.

        Не утверждаю что эта схема идеальна, но имхо в ней есть хотя бы толика логики. Здесь же просто если внутри случается S_FALSE, то стороннему юзеру возвращается STG_E_FILENOTFOUND. Конечно можно предположить костыль-схему "если ReadGenericXMLFile вернула S_FALSE, то это может значить только STG_E_FILENOTFOUND", однако такую схему трудно модифицировать.
        Ответить
        • Кстати S_FALSE это не ошибка ;) Если, конечно, автор ReadGenericXMLFile читал маны...
          Ответить
          • Да, согласен. Здесь наверное будет более уместно говорить "неудачная отработка функции" или как-то так.
            Ответить
    • С ненулевой вероятностью говнокод таится в ReadGenericXMLFile, который возвращает S_FALSE (который следует возвращать только при успешном исполнении!) вместо того самого STG_E_FILENOTFOUND. А это просто костыль для обхода сего недоразумения.
      Ответить
    • Какой только хуйней не страдают люди, которые не могут в исключения.
      Ответить

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