Czytam „C++ Programming Language 4. wydanie” Książka i mam pytanie odnośnie akapitu o obsługę wyjątków:Throwing wyjątek podczas obsługi wyjątku
Istnieją przypadki, w których obsługa wyjątków muszą być opuszczone do mniej subtelnych technik obsługi błędów. Zasady są następujące:
- Nie wyrzucaj wyjątku podczas obsługi wyjątku.
- Nie wyrzucaj wyjątku, którego nie można przechwycić.
Jeśli złapie Cię implementacja obsługi wyjątków, to zakończy Twój program.
Czy ktoś może podać mi przykład pierwszej wersji? Tylko coś takiego przychodzi mi na myśl, ale jest to poprawny kod zgodny z g ++:
try
{
throw 1;
}
catch(...)
{
try
{
throw 2;
}
catch(...)
{
cout << "OK";
}
}
nie należy zakładać, że coś jest ważne i/lub robi to, co myślisz, że tylko dlatego, że skompilowany! 'C++' ma pojęcie [* niezdefiniowane zachowanie *] (http://blog.regehr.org/archives/213), które z grubsza tłumaczy się jako "jeśli zrobisz coś nieważnego, wszystkie zakłady są wyłączone". Może się zawiesić, może działać, może wydawać się działać, ale wysłać wszystkie numery kart kredytowych do nigeryjskich książąt. Uwaga Nie mówię, że ten konkretny przypadek jest (myślę, że to nie jest UB, tylko niebezpiecznie blisko), ale nie myśl, że "skompilowałeś, to jest w porządku". – BoBTFish
Nie mogę się zgodzić z pierwszym z nich, ale mogę serdecznie zgodzić się z drugim. Istnieje * wiele * razy catch-blocks może wyrzucać wyjątki, w tym ten sam wyjątek (przez 'throw;'). – WhozCraig