Jaki jest zakres obiektu wyjątku w C++? czy wykracza poza zakres, gdy zostanie wykonany program obsługi catch? Ponadto, jeśli utworzę obiekt o nienazwanym wyjątku i wyrzucę go, to podczas przechwytywania tego wyjątku ma znaczenie, czy przechwycę go przez odwołanie do wartości stałej lub odwołanie do stałej?Zakres obiektu wyjątku w C++
Odpowiedz
Podczas oceny wyrażenia throw
obiekt wyjątku jest inicjowany z wartości wyrażenia. Wyrzucany obiekt wyjątku otrzymuje swój typ ze statycznego typu wyrażenia rzutowania, ignorując wszystkie kwalifikatory o wartości const
i. W przypadku typów klas oznacza to, że przeprowadzana jest inicjalizacja kopii .
zakres obiekt wyjątku jest poza zakresem bloku, w którym występuje rzut. Pomyśl o tym, jak żyjesz w specjalnym obszarze wyjątkowym po jednej stronie zwykłego stosu wywołań, w którym żyją lokalne obiekty.
Wewnątrz bloku nazwa zainicjowana za pomocą obiektu złapanego wyjątku jest inicjowana tym obiektem wyjątku, a nie argumentem do throw
, nawet jeśli była to l-wartość.
Jeśli wykonujesz catch
przez referencję bez stałych, możesz zmutować obiekt wyjątku, ale nie możesz go zainicjować. Możesz zmienić zachowanie programu, jeśli ponownie rzucisz wyjątek w sposób, który nie byłby możliwy, jeśli przechwycisz wartość lub odniesienie do const (na bok).
Przedmiotem wyjątku zniszczeniu przy ostatnim blokiem haczyk, który nie wychodzi przez ponowne projekcji (to jest ocena ekspresji rzut bezparametrową) kończy.
Przede wszystkim, obiekt rzucasz wychodzi z zakresu niemal natychmiast. To, co zostanie przechwycone przez procedury obsługi wyjątków, to kopia oryginalnego obiektu. Ta kopia zostanie usunięta po wykonaniu funkcji catch catch , chyba że zostanie przechwycona przez wartość (nie przez odniesienie). W takim przypadku zostanie utworzona kolejna kopia. Ale powinieneś go złapać przez odniesienie (najlepiej const).
Przedmiotem Wyjątek stanowi tylko w catch
bloku. Nie można użyć obiektu wyjątku poza blokiem catch
. Poniższe kroki zdarzyć, gdy wyjątek i haczyk:
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
- The
throw
klauzuli (// 1) otrzymuje lokalny obiektanObject
i traktuje ją jako wartość argumentu: tworzy kopięanObject
. - Uchwytprzechwytuje obiekt MyException Object, który ponownie jest parametrem wartości. W tej chwili tworzona jest kolejna kopia.
- Jeśli procedura obsługi
catch
byłby realizowany tak, aby otrzymać referencję do obiektu(catch (MyException &o))
, druga kopia jest unikać. - jeśli obsługa otrzymuje obiekt wyjątku przez
const&
, wówczas można wywoływać tylko metodyconst
.
Pytasz o życiu * *? – Joren
Tak .. kiedy to zostanie zniszczone? – Naveen
Aby wyjaśnić pytanie Joren: termin _scope_ zwykle odnosi się do regionu (linii kodu), gdzie zmienna ma nazwę.Słowo _scope_ jest często nadużywane, aby oznaczać _lifetime_, co jest, jak rozumiesz, jak długo ta zmienna faktycznie znajduje się w pamięci. – Thomas