2009-10-31 20 views
32

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++

+3

Pytasz o życiu * *? – Joren

+0

Tak .. kiedy to zostanie zniszczone? – Naveen

+8

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

Odpowiedz

32

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.

4

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).

+0

Co do rzucania wskaźnika do czegoś zgodnie z MFC? Musisz wziąć pod uwagę obiekty inne niż obiekty typu klasy, jak sugeruje to pytanie i odpowiedź. – Sam

+0

Wskaźniki też są kopiowane, ale nikogo to nie obchodzi :) – vava

8

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 obiekt anObject 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 metody const.
Powiązane problemy