Oto konfiguracja.Co się stanie, jeśli użyję "rzutu"; bez wyjątku do rzutu?
Mam C++ program, który wywołuje kilka funkcji, z których wszystkie potencjalnie rzucić ten sam zestaw wyjątku, a ja chcę to samo zachowanie dla wyjątków w każdej funkcji (np drukowania komunikat o błędzie & przywrócić wszystkie dane do domyślnego dla wyjątkuA; po prostu wydrukuj dla wyjątkuB; zamknij całkowicie dla wszystkich innych wyjątków).
Wydaje się, że powinienem być w stanie ustawić zachowanie catch zadzwonić prywatną funkcję, która po prostu ponownie generuje błąd i wykonuje połowy, tak jak poniżej:
void aFunction()
{
try{ /* do some stuff that might throw */ }
catch(...){handle();}
}
void bFunction()
{
try{ /* do some stuff that might throw */ }
catch(...){handle();}
}
void handle()
{
try{throw;}
catch(anException)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
catch(anotherException)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
catch(...)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
}
Teraz, co się stanie, jeśli „obsłużyć” jest wywoływany poza klasą wyjątków. Jestem świadomy, że to nigdy nie powinno się zdarzyć, ale zastanawiam się, czy zachowanie jest niezdefiniowane przez standard C++.
Zostaje zakończony, ale co mam zrobić ?, zapewni kompilator do uruchomienia tego programu, aby można było zweryfikować wynik. –
Wszystko, co zrobi kompilator, to go skompilować. I to się skompiluje, ponieważ nie ma nic na temat * definicji * uchwytu, aby ostrzec użytkownika, że na pewno będzie wymagał załadowanego wyjątku. Kompilatory nie mogą ci powiedzieć wiele przydatne o niezdefiniowanym zachowaniu, zwłaszcza coś takiego, że nie zostanie pobrane do czasu wykonywania. – deworde