Сишные функции не вызывают исключений. В Си их просто нет. Поэтому помещать их в try/catch нет смысла - проверяйте возвращаемые значения по старинке. Если хотите, можете написать обертки для стандартных функций, генерирующие исключения в случае ошибки. А еще лучше использовать std::fstream - вы же пишите на С++, так и пользуйтесь плюсовой стандартной библиотекой, а не Сишной.
void foo() {
    int *smth;
    try {
        smth = new int[100];
        if (5 < 4) {
            std::runtime_error("Беда");
        }
    } catch (std::runtime_error &e) {
        e.what();
    }
    delete[] smth;
}
new генерирует std::bad_alloc, если произойдет исключение - память не выделилась и ничего удалять не надо.