• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

try catch jak działa

Cloud VPS
0 głosów
2,152 wizyt
pytanie zadane 6 października 2015 w C i C++ przez niezalogowany
#include <iostream>

using namespace std;

int sprawdz(int x, int y)
{
    cin >> x >> y;
    return x/y;
}

int main()
{
    int a,b;

    try
    {
        cout << sprawdz(a,b);
    }
    catch(...)
    {
        cout << "blad";
    }

    return 0;
}

Może mi ktoś wyjaśnić czemu to nie działa prawidłowo i jak zrobić tak żeby działało to prawidłowo :)

2 odpowiedzi

0 głosów
odpowiedź 6 października 2015 przez criss Mędrzec (172,570 p.)

Nigdzie nie rzucasz żadnego wyjątku. Blok catch(...) łapie wszystko, więc tutaj nie musisz nic zmieniać. Musisz skądś ten wyjątek rzucić. Najlepiej przeczytaj to: http://xion.org.pl/files/texts/mgt/pdf/2_3.pdf Tutaj masz wszystko ładnie szczegółowo opisane, chociaż trudne to nie jest.

update:

Wyjątek rzucasz instrukcją throw. Np. w funkcji sprawdz() rzuć throw 2; (rzucasz int o wartości 2). Wtedy wyjątek "wyleci" (tzw. odwijanie stosu) poza funkcje (bo w funkcji nie został złapany) i zostanie złapany przez najbliższy odpowiadający mu block catch. catch(...) łapie wszystko, więc odpowiada wszystkiemu :D

komentarz 6 października 2015 przez niezalogowany

Używam tego throw i zrobiłem tak
 

int sprawdz(int x, int y)
{
    cin >> x >> y;
    throw y ;
    return x/y;
}

I nie wiem czy i gdzie błąd zrobiłem

komentarz 6 października 2015 przez criss Mędrzec (172,570 p.)
Nigdzie nie zrobiles błędu - tak jest w porządku.
komentarz 6 października 2015 przez niezalogowany
to czemu nadal mi wywala konsolę, chcę się zabezpieczyć przez taką sytuacją w try catch
komentarz 6 października 2015 przez criss Mędrzec (172,570 p.)

Przed jaką taką? Dlaczego miałoby ci się crashować z tego kodu?

Mówisz o dzieleniu przez 0, tak? To pisales pod odp Radflera :P

Radfler ci podesłał jakiegoś linka, chociaż nie zgłebiałem się w to za bardzo.

Jeśli twoja funkcja przyjmuje dzielnik w argumencie, to w środku funkcji sprawdź czy jest on równy 0. Stwórz sobie jakiś specjalny enum, np.:

enum ERROR { DIV_BY_ZERO}; //poki co 1-wartosciowy, ale moze kiedys bedziesz potzreboal wiecej..

Jeśli dzielnik jest równy zero - rzuć DIV_BY_ZERO. Blok catch niech łapie ERROR - catch(ERROR er){ kod } i powinno działać.

Jeśli nie mozesz sparwdzic jaka wartosc ma dzielnik jeszcze przed wykonaniem dzielenia, to jestes skazany na rozwiązanie podesłane przez Radflera.

 

0 głosów
odpowiedź 6 października 2015 przez Radfler VIP (101,030 p.)

Block try-block to blok służący do wyłapywania wyjątków. Działa on tutaj jak najbardziej prawidłowo, żaden wyjątek nie wystąpił ;)

http://en.cppreference.com/w/cpp/language/try_catch

Jeżeli chcesz aby taki wyjątek wystąpił musisz go rzucić z użyciem wyrażenia throw, np.

throw std::exception();

http://en.cppreference.com/w/cpp/language/throw

komentarz 6 października 2015 przez niezalogowany
jeśli jednak dzielimy przez 0 to mi konsolę wywala
komentarz 6 października 2015 przez Radfler VIP (101,030 p.)
Dzielenie przez zero w C++ to nie wyjątek. To błąd na poziomie systemu, tutaj działamy trochę inaczej. Dzielenie przez zero wyśle sygnał SIGFPE, który musi zostać przechwycony przez odpowiedni uchwyt:

http://en.cppreference.com/w/cpp/utility/program/signal

http://stackoverflow.com/questions/6121623/catching-exception-divide-by-zero

Podobne pytania

0 głosów
2 odpowiedzi 442 wizyt
pytanie zadane 7 grudnia 2017 w C# przez liledusty Obywatel (1,430 p.)
0 głosów
0 odpowiedzi 406 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez kuboxikk123 Nowicjusz (180 p.)

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...