LINUX.ORG.RU

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

Исправление 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");

  // далее работа
}

А ещё создашь по новому типу результата для проталкивания ошибки по стеку?

Не нужно, как видишь. Ошибку обработали на месте.