LINUX.ORG.RU

История изменений

Исправление eao197, (текущая версия) :

Возможно, я сделаю что-то подобное. Возможно сделаю свой тип для информации об ошибках. Возможно, я сделаю связный список ошибок. Зависит от.

Ну так покажите хотя бы один похожий на рабочий вариант. А то это все разговоры в пользу бедных. На C++ несложно сделать что-то вроде:

class my_special_closer {
  not_null<std::FILE *> what_;
  error_collector & collector_;
public :
  my_special_closer(not_null<std::FILE *> what, error_collector & collector)
    : what_(what), collector_(collector) {}
  ~my_special_closer() {
    if( EOF == std::fclose(what_.get()) )
      collector_.push_error(...);
  }
};
...
int foo(error_collector & collector) {
  std::FILE * f1;
  if( !(f1 = std::fopen(...)) ) return -1;
  my_special_closer f1_closer(f1, collector);

  std::FILE * f2;
  if( !(f2 = std::fopen(...)) ) return -1;
  my_special_closer f2_closer(f2, collector);

  std::FILE * f3;
  if( !(f3 = std::fopen(...)) ) return -1;
  my_special_closer f3_closer(f3, collector);
...
  if( -1 == some_other_op() ) return -1;
...
}
Что очень похоже на Go-шный defer или на D-шный at_scope(exit). И ничего у вас не потеряется.

Исходная версия eao197, :

Возможно, я сделаю что-то подобное. Возможно сделаю свой тип для информации об ошибках. Возможно, я сделаю связный список ошибок. Зависит от.

Ну так покажите хотя бы один похожий на рабочий вариант. А то это все разговоры в пользу бедных. На C++ несложно сделать что-то вроде:

class my_special_closer {
  not_null<std::FILE *> what_;
  error_collector & collector_;
public :
  my_special_closer(not_null<std::FILE *> what, error_collector & collector)
    : what_(what), collector_(collector) {}
  ~my_special_closer() {
    if( EOF == std::fclose(what.get()) )
      collector_.push_error(...);
  }
};
...
int foo(error_collector & collector) {
  std::FILE * f1;
  if( !(f1 = std::fopen(...)) ) return -1;
  my_special_closer f1_closer(f1, collector);

  std::FILE * f2;
  if( !(f2 = std::fopen(...)) ) return -1;
  my_special_closer f2_closer(f2, collector);

  std::FILE * f3;
  if( !(f3 = std::fopen(...)) ) return -1;
  my_special_closer f3_closer(f3, collector);
...
  if( -1 == some_other_op() ) return -1;
...
}
Что очень похоже на Go-шный defer или на D-шный at_scope(exit). И ничего у вас не потеряется.