Про деструкторы и исключения - исключения из деструктора вылетать не должно.
Т. е. все действия, которые могут повлечь генерацию исключения нужно делать либо в конструкторе, либо явно вызывая какую-либо функцию.
Например, пусть у нас есть класс для транзакций trans_t. Для удобного использования, он должен иметь явные метоы commit - могущий выкинуть исключение и rollback - не выкидывающий.
В деструкторе транзакция должна проверять была ли она завершена, и если нет, вызывать rollback.
Так же и file_t - должен иметь функцию flush - сбрасывающую буфера на диск и могущую выкинуть исключение и функцию close закрывающую файл без исключений. В деструкторе вызывается именно close если файл всё ещё открыт.
Ну и
RAII - всего лишь удобная аббревиатура ссылающаяся на совершенно конкретный приём/шаблон программирования.
Ничего особо выдающегося или гениального в ней нет - всего лишь систематизация, как и написал
BRE