Jump to content

Archived

This topic is now archived and is closed to further replies.

zizou666

Rozwiązany: Rzucanie wyjątków C++

Recommended Posts

Mam taki problem kiedy probuje wzbogacic swoje stare programy o obsluge sytuacji wyjatkowych. Otoz mam jakis konstruktor w klasie odpowiedzialnej za date, no i w tym kostruktorze rzucam sobie wyjatki jesli cos mi tam nie pasuje. Potem w mainie mam taki fragment kodu:

                        try
            {
            data proba(30, 2, 2000);                                                
            }
            catch (int)
            {
                data proba(1,1,2000);
                cout<<proba;
            }

Wyjatek jest rzucany po prostu w postaci liczby int, ale mniejsza o to. Kiedy zawartosc "try" nie jest spelniona wszystko jest ok, wchodzi do "catch" i wykonuje co tam ma wykonac. Kiedy natomiast jest spelniona to tworzy mi obiekt, ktorego nie moge uzywac w reszcie programu. Jesli wtedy za "catch" napisac np "cout<<proba" to wysoczy blad, ze obiekt "proba" nie istnieje. Wydaje sie to w miare logiczne, ale jest jakis sposob zeby to obejsc? Z gory dzieki za pomoc.

I jakby co: tak, tak - mam przeladowany operator "<<" w swojej klasie data :D

Link to comment
Share on other sites

Ponieważ deklaracja obiektu proba znajduje się w bloku try-catch, to poza tym blokiem nie jest już widoczna (precyzyjniej rzecz ujmując zasięg obiektu kończy się wraz z klamrą zamykającą blok try-catch. W przypadku gdy wyrzuca wyjątek, program wchodzi do bloku catch, tam deklaruje obiekt proba i wywołuje na nim operację, dlatego działa.

Możesz to poprawić używająć wskaźników i dynamicznie tworząc obiekt, czyli coś takiego:

data* pProba;
try
{
pProba = new data(30, 2, 2000);
}
catch (int)
{
pProba = new data(1,1,2000);
cout << &pProba;
}

//...
//...

delete pProba;

Link to comment
Share on other sites

No w C++ zmienna jest przypisana do bloku w którym została zdefiniowana. W tym wypadku do bloku try. W C jest inaczej, tam zmienne są związane z funkcją.

Co z tym zrobić? Trzeba zmienną zdefiniować przed blokiem try. Nie ma innej opcji. Jeżeli obiekt ma konstruktor i koniecznie musi on zostać wywołany w bloku try, to używa się alokacji dynamicznej (ewentualnie robisz placement new na wcześniej przygotowanym obszarze pamięci - kwestie wydajności alokacji pamięci). I tutaj ujawnia się ogromna wada wyjątków. Są jedyną metodą obsługi błędów konstruktora i jednocześnie utrudniają używanie konstruktora.

I pamiętaj, nigdy nie rzucaj wyjątku z destruktora. Nigdy!

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...