jeśli sam tworzysz klasy wyjątków, to stwórz sobie wyjątek ogólny i niech z niego dziedziczą szczegółowe. W catchu przejmujesz główny wyjątek i wszystkie dziedziczące po nim też wędrują do tego catcha.
Dobrze jest, jak np wszystkie dziedziczą po std::exception i udostępniają swoją własną wersję funkcji what.
Jeśli korzystasz z gotowych wyjątków, to poczytaj jak one po sobie dziedziczą, bo to jest dobrze projektowane i z reguły te szczegółowe wywodzą się z jakichś ogólnych klas (abstrakcyjnych nawet często).
A jak już nic nie możesz, to sobie po prostu napisz funkcje i niech te catche wyglądają tak przynajmniej:
try { /* ... */ }
catch(exception1& ) { my_fun(); }
catch(exception2& ) { my_fun(); }
catch(exception3& ) { my_fun(); }
// ...
dopisane:
a no i funkcja my_fun może być szablonem, jeśli wiesz, że możesz na tych błędach zrobić coś wspólnego (mimo, że nie są tych samych typów).
template<class Error>
void my_fun(Error& error) {
// ...
}
// ...
try { /* ... */ }
catch(exception1& e) { my_fun(e); }
catch(exception2& e) { my_fun(e); }
catch(exception3& e) { my_fun(e); }
// ...