Re[2]: Оформление обработки ошибок в plain C
От: barmafon  
Дата: 18.06.04 08:18
Оценка: 19 (4) +1
TC>еще один вариант — "липовый" do {}while(0);
TC>плюсы :
TC> + в любом месте можно выйти из него простым break не заботясь о вызове деструкторов
TC> + все деструкторы вызываются в одном месте
TC> + несмотря на похожесть на вариант с goto тут нет меток
TC> + внутри do {} while() можно завести какой локальный объект внутри тела блока.
TC> минусы :
TC> — кому то может показаться что do {} while() используется не по делу)
TC> — код все таки уползает вправо хотя и медленно.
TC> — проверки на NULL режут глаз

для устранения минуса №3 можно воспользоваться следующей техникой:
int f()
{
  int stage, failed;
  void *obj1;
  void *obj2;
  for( stage = 0;; ) {
    if( !(failed=construct_obj1(&obj1)) )
      break;
    ++stage;
    if( !(failed=construct_obj2(&obj2)) )
      break;
    ++stage;
    if( !(failed=do_something(obj1,obj2)) )
      break;
    ++stage;
    break;
  }

  switch( stage ) {
  case 3: break;
  case 2: destruct_obj2(obj1);
  case 1: destruct_obj1(obj1);
  }

  return failed;
}


плюсы:
+ красиво
+ мы не обязаны инициализировать указатели на создаваемые объекты
минусы:
— нужна специальная переменная stage
— отслеживание значений переменной stage в каждой точке инициализации
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.