Сишные функции не вызывают исключений. В Си их просто нет. Поэтому помещать их в 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, если произойдет исключение - память не выделилась и ничего удалять не надо.