История изменений
Исправление pihter, (текущая версия) :
Ты на каждый случай будешь писать обёртку?
Все уже украдено до нас. А так — да. Это ничем не сложнее, чем управлять исключениями в плюсах. (я, если честно, не помню как оно там) Но давай сравним: вот задача — наша программа открывает файл и работает с ним. Нужно реализовать контролируемое поведение в этом случае, в соответствии с настройкой из конфига. Либо программма выводит ошибку и завершается, либо программа пишет лог и продолжает работать. Чтение конфига и запись лога оставим за скобками, я напишу на Си, а ты обработай исключение на плюсах
int need_exit_at_fileerror = 1; // читается за скобками из конфига
// можно спрятать в отдельный файл обработки "исключений"
FILE * Fopen(char *filename, char *mode) {
// обертка для обработки "исключения" при чтении файла
FILE *f = fopen(filename, mode);
if (f != NULL) return f;
if (need_exit_at_fileerror) {
perror("Ошибка чтения файла. Выход.\n");
exit(1);
} else {
write_log("Ошибка чтения файла.\n");
}
return f;
}
int main(void) {
FILE *f = Fopen("tux.bmp", "rb");
// далее работа
}
А ещё создашь по новому типу результата для проталкивания ошибки по стеку?
Не нужно, как видишь. Ошибку обработали на месте.
Исходная версия pihter, :
Ты на каждый случай будешь писать обёртку?
Все уже украдено до нас. А так — да. Это ничем не сложнее, чем управлять исключениями в плюсах. (я, если честно, не помню как оно там) Но давай сравним: вот задача — наша программа открывает файл и работает с ним. Нужно реализовать контролируемое поведение в этом случае, в соответствии с настройкой из конфига. Либо программма выводит ошибку и завершается, либо программа пишет лог и продолжает работать. Чтение конфига и запись лога оставим за скобками, я напишу на Си, а ты обработай исключение на плюсах
int need_exit_at_fileerror = 1; // читается за скобками из конфига
// можно спрятать в отдельный файл обработки "исключений"
FILE * Fopen(char *filename, char *mode) {
// обертка для обработки "исключения" при чтении файла
FILE *f = fopen(filename, mode);
if (need_exit_at_fileerror) {
perror("Ошибка чтения файла. Выход.\n");
exit(1);
} else {
write_log("Ошибка чтения файла.\n");
}
return f;
}
int main(void) {
FILE *f = Fopen("tux.bmp", "rb");
// далее работа
}
А ещё создашь по новому типу результата для проталкивания ошибки по стеку?
Не нужно, как видишь. Ошибку обработали на месте.