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;
}