[VC++] różne wyjątki i jedna akcja

0

Przechwytuję wyjątki wyrzucane przez pewną funkcję. Chcę, by dla kilku z nich wykonana była jedna akcja, a dla kilku innych inna. Jak to zapisać, bym nie musiał powtarzać tego samego kodu w poszczególnych blokach catch?

try{
  // jakis kod
} catch(Exception1 ^){
  // AKCJA 1
} catch(Exception2 ^){
  // AKCJA 1
} catch(Exception3 ^){
  // AKCJA 1
} catch(Exception4 ^){
  // AKCJA 2
} catch(Exception5 ^){
  // AKCJA 2
} catch(Exception6 ^){
  // AKCJA 2
}
0

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); }
// ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1