История изменений
Исправление 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;
...
}
Исходная версия 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;
...
}