Personalmente metterei ogni blocco di codice che può lanciare eccezioni dentro un try {} catch() e lo gestirei ad un livello inferiore. In genere quando si arriva al main ci si limita a far terminare il programma in modo pulito.
Per evitare il ciclo infinito puoi mettere una variabile di flag che conti quante volte viene sollevata un'eccezione e inserirla nel do {} while().
Del resto se il programma continua a lanciare eccezioni significa che c'è qualcosa di sbagliato.
codice:int main() { int maxExcept(10); do{ try{ ... ... ... ... } catch (int x) { ... ... maxExcept--; } } while(x<7 && maxExcept != 0); return 0; }