errors handling

Тема в разделе "LANGS.C", создана пользователем osox, 9 июл 2010.

  1. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    холи.., а, у меня для этого даже картинка есть (многие с ней уже знакомы, хе хе)
    [​IMG]
    языкохоливар! что-то мы про него в самом деле в последнее время забыли)

    давайте уж тогда про ООП сразу, вот я ООП люто презираю, потому что он абстрагирует, а это недопустимо, когда речь идёт о чистой логике! )
     
  2. reversecode

    reversecode Guest

    Публикаций:
    0
    osox
    правильный вариант 1
    вариант 2 это то во что преобразует компилятор и преобразиться в asm коде
    вариант 3 дурдом
    4 - это не С код, это идиома M$
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    do
    {
    } while(0);

    вполне нормальная конструкция, только глубину вложенности повышает, однако чаще всего не очень сильно мешает.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вложенные ифы, кстати, вполне приемлимы, если вызовов функций до 4х штук.
    Ну а так обычно я юзаю 2 или 4. (вариант 1 - бред)

    GoldFinch
    за такие посты надо бить по еб.. лицу
     
  5. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    как она вобще может помешать то?
    преимущества перед (1) - 1 вход и 1 выход
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ну есть же 2 схемы работы.
    SEME и SESE.
    Single Enter Single (Multiply) Exit.
    У каждого подхода свои плюсы и минусы.
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    вообщем так удобно получилось :)
    Код (Text):
    1. retcode ubzd4guwedudy(argtype this)
    2. {
    3.     file_t file = NULL;
    4.     thread_t thread = NULL;
    5.     map_t map = NULL;
    6.     retcode retval;
    7.  
    8.     file = openfile...
    9.     EXIT_ON_TRUE(!file, ERROR_FILE_NOT_FOUND);
    10.  
    11.          
    12.     thread = openthread...
    13.     EXIT_ON_TRUE(!thread, ERROR_ACCESS_DENIED);
    14.        
    15.  
    16.     map = openmap...
    17.     EXIT_ON_TRUE(!map, ERROR_NOT_ENOUGH_MEMORY);
    18.        
    19.                
    20.     retval = ERROR_SUCCESS;
    21.        
    22.     ...processing...
    23.  
    24.  
    25. Exit:
    26.     CLEANUP(closefile, file);
    27.     CLEANUP(closethread, thread);
    28.     CLEANUP(closemap, map);
    29.  
    30.    
    31.     return retval;
    32. }
    а вообще вот еще макросов для разных ситуаций написал
    Код (Text):
    1. #define FINALLY_ON_TRUE(expr) \
    2.     do { if (expr) { __leave; } } while (0)
    3.  
    4. #define FINALLY_VAL_ON_TRUE(expr, retvalue) \
    5.     do { if (expr) { retval = retvalue; __leave; } } while (0)
    6.  
    7. #define EXIT_ON_TRUE(expr) \
    8.     do { if (expr) { goto Exit; } } while (0)
    9.  
    10. #define EXIT_VAL_ON_TRUE(expr, retvalue) \
    11.     do { if (expr) { retval = retvalue; goto Exit; } } while (0)
    12.  
    13. /*
    14.  * RESOURCE_NOT_RESERVED
    15.  * jump to cleanup before allocating resource
    16.  */
    17. #define  RESOURCE_NOT_RESERVED 0x20000005
    18.  
    19. #define CLEANUP_RET(pfn, val) ( \
    20.         (val) ?                 \
    21.         (intptr_t)(pfn)(val) :  \
    22.         RESOURCE_NOT_RESERVED )
    23.  
    24. #define CLEANUP(pfn, val) ((void)( \
    25.            (val) ? (pfn)(val) : 0 ))
    26.  
    27. #define CLEANUP_VAL(pfn, val1, val2) ((void)( \
    28.         ((val1) != (val2)) ? (pfn)(val1) : 0 ))
    29.  
    30. #define CLEANUP_ON_TRUE(pfn, val, flag) ((void)( \
    31.              ((val) && (flag)) ? (pfn)(val) : 0 ))
    32.  
    33. #define CLEANUP_ON_TRUE_IF(pfn, val1, val2, expr) ((void)( \
    34.            ((val1) && (val2) && (expr)) ? (pfn)(val2) : 0 ))
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    смотрится красиво нет всех этих ифов и готов :))
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Great
    за какие?

    про то что на Си норм люди не пишут?
    так Си полностью входит в С++,
    Си устарел, он не развивается т.к. нафиг никому не нужен, последний стандарт вышел 11лет назад, и его до сих под мало кто поддерживает, т.к. все забили на Си
    да и развивать там нечего - все уже развито в С++
    Си не отвечает требованиям предъявляемым к современным промышленным языкам, by design

    единственный смысл юзать Си - юзать его там, где нет ничего лучше, например для МК для которых нет компилятора С++ или других языков

    собственно это тема - причина того что Си устаревший язык. В других языках такой проблемы нет, юзать goto для разруливания ошибок, или нет
     
  10. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    n0name
    мне она поэтому и не нравится что на пустом месте растет уровень вложенности это какое то готофобство уже получается лучше уж goto чем это хотя кому как найдутся и сторонники иного мнения :)))
     
  11. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    osox
    Вложенность видно сразу, а метку нет.
    Что касается остальных вариантов - мне наиболее симпатичен третий, поскольку логику программы проще понять предполагая положительный результат вызова ф-ций. И пофик сколько уровней вложенности.
    Иначе, вспоминается комичный вариант объяснения прохожему как пройти до места назначения: там увидишь поворот направо, туда не ходи, потом слева будет улица, которая ведет на рынок, тебе туда тоже не нужно, потом еще будет поворот, если туда пойти, то увидишь еще что-то, но тебе тоже не туда.. вместо того, чтобы просто сказать - иди прямо.