На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (37) « Первая ... 33 34 [35] 36 37   ( Перейти к последнему сообщению )  
> C vs C++ , Не опять а снова
    Цитата Wound @
    Ну если там int'ы возвращаются, или какие нибудь char'ы, строки, то тут конечно без доков ниче не поймешь. В COM'ах всяких наприме всякие HRESULT'ы возвращаются, этих там кодов овер дофига, а каждая функция, естественно не все возвращает, и приходится тоже лезть в доку. Если бы там как то разграничить эти коды, возможно было бы проще.
    Вот именно. На практике я заметил, что в языках с поддержкой нормальных макро, использовать возврат ошибок не сложнее и не легче, чем исключения. Это скорее вопрос вкуса/религии или традиций самого языка.
    В языках вроде плюсов, D, JavaScript исключения однозначно удобнее, так как проброску возвращаемых ошибок придется делать вручную или уродливым препроцессором или строковым миксином (для D). Тем более, что в D и JavaScript ещё и стектрейс есть.

    Добавлено
    Цитата Wound @
    Сях все равно это преврящается в ручной вызов функции очистки. Я то говорил в контексте Си, а не С++.
    Для сей вся дискуссия бессмысленна. В сях нет исключений. SEH это чисто виндовая фигня не имеющая к стандартным сям никакого отношения.
    Сообщение отредактировано: applegame -
      Цитата applegame @
      На практике я заметил, что в языках с поддержкой нормальных макро, использовать возврат ошибок не сложнее и не легче, чем исключения.

      О каких языках речь?
        Цитата OpenGL @
        О каких языках речь?
        Я непосредственно работаю в elixir, аналогичное можно замутить в Nim и Crystal. в Rust, вроде тоже есть что-то для этого, то ли макро, то ли что-то встроенное в сам язык.
        Сообщение отредактировано: applegame -
          Цитата Wound @
          Вот Qraizer там про SEH писал и что исключения очень хорошо ложатся в модель Си. Но лично я не понимаю как они туда ложаться. Ведь в том же Си нет ни конструкторов, ни деструкторов. При генерировании исключения, которое проглядели - утечка гарантирована ИМХО.
          Ну так перечитай ещё раз. Там всё расписано.

          Добавлено
          Цитата Wound @
          RAII хороший в С++, в Сях все равно это преврящается в ручной вызов функции очистки.
          В SEH нет.

          Добавлено
          ExpandedWrap disabled
            void doSomething(void)
            {
              void *buf = NULL;
             
              __try
              {
                buf = malloc(BUF_SIZE);
             
            /* blah-blah-blah */
             
                doEvilFunc_thatRaises_EXCEPTION_INT_DIVIDE_BY_ZERO();
             
            /* blah-blah-blah */
              }
              __finally
              {
                if (buf != NULL) free(buf);
              }
            }
            Цитата Qraizer @
            В SEH нет.

            Ну так а чем это отличается от goto cleanup: ? Разве что goto писать не нужно, но __try нужно, и __finally не забыть, и не забыть очистить все ресурсы. Плюс ко всему если ты пишешь кросплатформенный код, то такой трюк уже не прокатит, либо придется писать еще и макросы в придачу.
              Фенечка для GCC:

              ExpandedWrap disabled
                # include <stdio.h>
                 
                /* Demo code showing the usage of the cleanup variable
                   attribute. See:http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
                */
                 
                /* cleanup function
                   the argument is a int * to accept the address
                   to the final value
                */
                 
                void clean_up(int *final_value)
                {
                  printf("Cleaning up\n");
                  printf("Final value: %d\n",*final_value);
                 
                }
                 
                int main(int argc, char **argv)
                {
                  /* declare cleanup attribute along with initiliazation
                     Without the cleanup attribute, this is equivalent
                     to:
                     int avar = 1;
                  */
                  
                  int avar __attribute__ ((__cleanup__(clean_up))) = 1;
                  avar = 5;
                 
                  return 0;
                }
                Цитата Wound @
                Ну так а чем это отличается от goto cleanup: ?
                Нелокальностью. Ты не сделаешь goto далеко наружу, но можешь longjmp(). Локально же ты можешь сделать не только goto, но ещё и return, break и continue.
                Цитата Wound @
                Разве что goto писать не нужно, но __try нужно, и __finally не забыть, и не забыть очистить все ресурсы.
                Патерн в той теме, что ты приводил как пример из MSDN, как раз для условий отсутствия SEH, там какой-нибудь goto cleanup вполне себе нормально. Но опять же локально, и как ты говоришь, нужно не забыть везде так прописать. Забыл и влепил return, усё, приехали. И фактически он реализует лишь break, что-либо другое реализовать на нём можно, но всё сразу... И проблема с нелокальностью всё равно остаётся, longjmp()-у коллинеарно на твои goto внутри снимаемых с исполнения функций.
                Не забыть – естественно. Ну так на то это и Structural Exteption Handling. RAII на классах делает это гораздо удобнее, уже не забудешь. Та и на кодах ошибки же всё равно тоже надо не забывать прописывать очистки.
                Цитата Wound @
                Плюс ко всему если ты пишешь кросплатформенный код, то такой трюк уже не прокатит, либо придется писать еще и макросы в придачу.
                Я разве не говорил, что на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно? И всё потому, что SEH не языковой механизм.
                Сообщение отредактировано: Qraizer -
                  Цитата Qraizer @
                  на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно?

                  :crazy:
                    Цитата Qraizer @
                    Нелокальностью. Ты не сделаешь goto далеко наружу, но можешь longjmp(). Локально же ты можешь сделать не только goto, но ещё и return, break и continue.

                    Так подожди, в твоем коде нет __catch, если я не забыл, он там должен быть для обработки исключения. Соответственно если в функции выше нет этого __catch, значит в ней будет утечка, если ресурсы выделились? Или ты хочешь сказать что предется все функции оборачивать в __try/__finaly?


                    Цитата Qraizer @
                    Я разве не говорил, что на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно? И всё потому, что SEH не языковой механизм.

                    ну не помню, может быть в той статье про SEH ты что то упоминал. :-?
                      Цитата Wound @
                      Так подожди, в твоем коде нет __catch, если я не забыл, он там должен быть для обработки исключения.
                      Зачем он мне там? Я не хочу заниматься не своим делом.
                        Цитата Qraizer @
                        Зачем он мне там? Я не хочу заниматься не своим делом.

                        Ну так я и говорю, допустим кто то вызовет твою функцию, в своей функции, но перед вызовом выделит ресурсы, и забудет обернуть в __try/__finally - в итоге будет утечка ? Т.е. при таком подходе придется тело каждой функции, где есть выделение ресурсов оборачивать в __try/__finally ?
                          Ну да. Если я соблюдаю свой контракт, это не означает, что я отвечаю за чужие. Но вот что однозначно верно в случае SEH – мои контракты порушить никто не способен. Я их буду выполнять всегда, каким бы злым не был окружающий меня код.
                            Wound, все решается документацией и качеством оформления кода, если либа не для себя, а в команду или паблик. Если есть гарантии, что исключений не будет - не нужно конечно. А если знаешь, что исключения могут быть, будь добр - не забывай. А то так договоримся, что ты забудешь, что делить на ноль нельзя, но обвинишь разработчика либы, которую пользуешь.
                            Скрытый текст
                            ЗЫ: Да и для себя лучше не лениться, и делать все что нужно
                              __attribute__(cleanup) не всесилен. Локальную размотку он делает, а вот глобальную прощёлкивает. Правда, в режиме C++ не прощёлкивает исключения, но кому оно такое надо в Плюсах? Там своё есть, языковое.
                                Цитата Qraizer @
                                но кому оно такое надо в Плюсах

                                Конечно.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (37) « Первая ... 33 34 [35] 36 37 


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0639 ]   [ 15 queries used ]   [ Generated: 28.04.24, 06:37 GMT ]