Skip to content

Commit 744f4dc

Browse files
authored
Update cpp_inst07.md (#139)
1 parent 5edf2bb commit 744f4dc

1 file changed

Lines changed: 26 additions & 15 deletions

File tree

cpp_inst07.md

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,39 +52,50 @@ catch(...)
5252
Zanim powiemy o tym jak rzucać wyjątki i jakie mogą mieć typy, zobaczmy konkretny przykład sytuacji, w której wyjątek jest rzucany przez bibliotekę standardową.
5353

5454
#### Zadanie 1
55-
Napisz program, który wczytuje z klawiatury liczbę całkowitą.
56-
Następnie w bloku `try` stwórz wektor wypełniony zerami o długości podanej z klawiatury.
55+
Napisz program, który tworzy wektor 100 `int`ów, dowolnie go wypełnia (np. zerami), a następnie wczytuje z klawiatury liczbę całkowitą `index` i drukuje co znajduje się w wektorze pod indeksem `index`.
56+
Do dostępu do wektora użyj metody `at`, nie operatora nawiasów kwadratowych.
57+
Następnie w bloku `try` stwórz wektor wypełniony zerami o długości 100.
5758
W bloku `catch(...)` wyświetl wiadomość informującą, że został rzucony wyjątek.
58-
Sprawdź co stanie się, gdy podasz małą liczbę, a co gdy podasz liczbę przekraczającą pamięć RAM dostępną na Twoim komputerze.
59+
Sprawdź co stanie się, gdy podasz liczbę 42, a co gdy podasz liczbę przekraczającą rozmiar wektora.
5960

6061
### Rozróżnianie wyjątków, `std::exception`
6162
W zadaniu 1, blok `catch(...)` pozwolił nam na wykrycie, że *pewien* wyjątek został rzucony.
6263
Często chcemy jednak, aby sam wyjątek niósł ze sobą jakąś informację.
6364
Mamy możliwość łapania *konkretnych typów* wyjątków.
64-
Na przykład, klasy i funkcje biblioteki standardowej w przypadku nieudanej alokacji pamięci rzucają wyjątek typu `std::bad_alloc`.
65+
Na przykład, biblioteka standardowa w przypadku "bezpiecznego" dostępu poza zakres (metody `at` różnych kontenerów) rzucają wyjątek typu `std::out_of_range`.
6566

6667
#### Zadanie 2
67-
Wykonaj zadanie 1, tym razem łapiąc konkretny wyjątek typu `std::bad_alloc`.
68+
Wykonaj zadanie 1, tym razem łapiąc konkretny wyjątek typu `std::out_of_range`.
6869
Wyświetl do konsoli wiadomość zawartą w tym wyjątku (użyj metody `what`).
6970

7071
Może się zdarzyć, że w bloku `try` mogą zostać rzucone różne typy wyjątków.
7172
W zależności od tego, jaki błąd wystąpił, mamy wtedy możliwość wykonania innego zestawu instrukcji.
72-
Zobaczmy to na przykładzie `std::bad_alloc` i `std::bad_variant_access`.
73-
`std::bad_variant_access` jest typem wyjątku, który rzucany jest gdy próbujemy dostać się do wariantu poprzez typ, którego obecnie nie trzyma.
73+
Zobaczmy to na przykładzie `std::out_of_range` i `std::bad_cast`.
74+
`std::bad_cast` jest typem wyjątku, który rzucany jest gdy próbujemy rzutować dynamicznie (`dynamic_cast`) referencję na typ bazowy `B&` na referencję na typ pochodny `D1&`, a okazuje się, że referencja wskazuje na obiekt innego typu, np. `D2`.
75+
Przykład takiej hierarchii klas podano niżej:
76+
77+
```c++
78+
struct B {
79+
virtual void dummy() = 0;
80+
};
81+
struct D1 : B {
82+
void dummy() override {}
83+
};
84+
struct D2 : B {
85+
void dummy() override {}
86+
};
87+
```
7488
7589
#### Zadanie 3
76-
Napisz program, który wczytuje z klawiatury liczby całkowite `a` i `b`.
77-
Następnie w bloku `try` stwórz wektor wypełniony zerami o długości `a` oraz wariant typu `std::variant<int, std::string>`.
78-
Jeżeli `b` jest parzyste, przypisz do wariantu wartość 42, a jeżeli nie, wartość `"nieparzyste"`.
79-
Spróbuj wyświetlić wartość trzymaną przez wariant jako `int` (`std::cout << std::get<int>(v)`).
80-
Napisz 2 bloki `catch`, jeden łapiący `std::bad_alloc`, jeden łapiący `std::bad_variant_access`, w których wyświetlisz wiadomość o rzuconym wyjątku.
81-
Zbadaj zachowanie programu w zależności od podanych z klawiatury zmiennych.
90+
Wykonaj ponownie zadanie drugie, ale tym razem oprócz indeksowania wykonaj niepoprawne dynamiczne rzutowanie opisane powyżej
91+
Napisz 2 bloki `catch`, jeden łapiący `std::out_of_range`, jeden łapiący `std::bad_cast`, w których wyświetlisz wiadomość o rzuconym wyjątku.
92+
Zbadaj zachowanie programu w zależności od podanej z klawiatury zmiennej.
8293
8394
Wyjątki rzucane przez bibliotekę standardową są polimorficznymi typami, które dziedziczą po klasie `std::exception` i nadpisują jej wirtualną metodę `what` (vide [dokumentacja](https://en.cppreference.com/w/cpp/error/exception)).
84-
W przypadku, gdy nie zależy nam na innym zestawie instrukcji dla różnych typów wyjątków, a jedynie informacji jaki typ wyjątku został rzucony, możemy to wykorzystać, pisząc tylko jeden blok `catch` łapiący klasę bazową.
95+
W przypadku, gdy nie zależy nam na innym zestawie instrukcji dla różnych typów wyjątków, a jedynie informacji jaka sytuacja wyjątkowa miała miejsce, możemy to wykorzystać, pisząc tylko jeden blok `catch` łapiący klasę bazową.
8596
8697
#### Zadanie 4
87-
Wykonaj ponownie zadanie 3, tym razem pisząc tylko jeden blok `catch`, łapiący wyjątek typu `std::exception`.
98+
Wykonaj ponownie zadanie 3, tym razem pisząc tylko jeden blok `catch`, łapiący (przez referencję) wyjątek typu `std::exception`.
8899
Wyświetl w nim informację zwróconą przez metodę `what`.
89100
Zbadaj zachowanie programu w zależności od podanych z klawiatury zmiennych.
90101

0 commit comments

Comments
 (0)