Ich verstehe nicht, wieso die Tiefe der Aufrufebene eine Rolle spielen sollte. Exceptions sollen geworfen werden, wo sie auftreten und behandelt werden, wo die Möglichkeit der Behandlung besteht. Da ist doch egal, ob dies die oberste Ebene des Programms ist oder nicht.
Was hier eher auffällt ist, dass du Exceptions anscheinend eher als eine Art Kontrollflussinstrument benutzt. Die Ebenen in der die Exception auftreten und behandelt werden (wobei die Ausgabe einer Fehlermeldung nicht wirklich eine Behandlung ist, aber wir wollen mal nicht pingelig sein*) sind bei dir ja die gleichen!
if(!CreateNewFile(value,"bla"))
{
cerr << "error in creating file with random values!\n";
return 0;
}
*: Dir ist schon bewusst, dass spätestens die Laufzeitumgebung alle Expeptions fangen wird** und dann in der Regel eine entsprechende Meldung gibt? Nutz ein normales Exceptionobjekt anstatt std::string, wenn du eine aussagekräftigere Meldung möchtest. Hier zum Beispiel eine typische Ausgabe auf gängigen Linuxplattformen:
http://ideone.com/UAuwJg
**: Irgendein Klugscheißer erklärt dir gleich, wieso es in diesem Fall technisch inkorrekt ist, von "Fangen" zu reden. Ich halte mich damit nicht auf.