Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Wyjątki w C++

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Śro 15:38, 17 Maj 2006    Temat postu: Wyjątki w C++

Mam pytanie, mam w projekcie 3 pliki, załóżmy - biblioteka.h, biblioteka.cpp, no i main.cpp. Czy możliwe jest rzucenie wyjątku w bibliotece, a złapanie go w mainie? Próbowałem na różne sposoby i albo w ogóle nie da się skompilować, albo działa, tylko wyjątek nie jest łapany (tzn program wychodzi ale nie wiadomo na którym wyjątku)...
Z góry dizęki za odpowiedzi.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Śro 15:52, 17 Maj 2006    Temat postu:

Wydaje się to calkiem racjonalne żeby tak zrobić... Jak Ty to robisz, że Ci nie działa?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Śro 15:59, 17 Maj 2006    Temat postu:

wymienię wszystkie niedziałające sposoby:

1. w bibliotece:
try{ [kod] throw("wyjatek") [kod]} - i po tym 'try' kompilator domaga się catcha, więc daję cath, ale łapiący inta, żeby wyjątek leciał dalej: catch(int fake){}.
No i potem w mainie: catch(const char* komunikat){std::cout << komunikat;} - z tym że przed catchem kompilator rząda try, więc wstawiam pusty try{}.

2. nie stosuję w bibliotece try, tylko na żywca w kodzie piszę throw("wyjatek"); ,
a w mainie to samo co powyżej.

EDIT: spróbowałem też 3 sposobu - w bibliotece łapię wyjątek i rzucam go dalej za pomocę throw; ale też nie działa

mam nadzieję że nie zamotałem


Ostatnio zmieniony przez cheater_ dnia Śro 16:08, 17 Maj 2006, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Śro 16:06, 17 Maj 2006    Temat postu:

Składnia wyjątków jest taka, że try musi być przed catch inaczej wynik jest nieokreślony (chyba, zaraz sprawdzę); czyli:
Kod:
try {
   [kod]
   [tutaj możesz przejść gdzie kolwiek, wyjść poza plik itd]
   [kod]
} catch (...){
}

Tego nie można rozdzielić, nawet jedną instrukcją, co dopiero plikiem. Ale możesz przepuścić wyjątek dalej. Ważne, żeby go złapać.

U Ciebie to powinno wyglądać jakoś tak:
1. W bibliotece:
Kod:
try{
   throw(aaa);
} catch(bbb){
   do_nothing();
}


2. w main:
Kod:
try{
   function_that_can_throw();
} catch (aaa){
   do_sth_with_aaa(aaa);
}


Są dwa bloki try-catch, bo może się zdarzyć, że pojawi się błąd który jesteś w stanie obsłużyć jeszcze w bibliotece, ale może się też zdarzyć błąd użytkownika biblioteki, to wtedy kompilator pozbiera zabawki i wróci do maina, do pliku z programem, i tam sobie go bsłużyć możesz sam.

Możesz mi też nie uwierzyć, nigdy nie bawiłem się w wyjątki. Jak piszę programy, to są one bezbłędne <big_joke> ;]


Ostatnio zmieniony przez oinopion dnia Śro 16:11, 17 Maj 2006, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Śro 16:17, 17 Maj 2006    Temat postu:

dzięki, pomogło :D
mam teraz taki lol-owy kod:

Kod:
int main(){
    try{

        //ciało programu :P :P

    }
}


bo nie chce mi się 500 razy łapać wyjątków, jak można raz a dobrze :P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Śro 17:51, 17 Maj 2006    Temat postu:

Nie no, przecież kompilator C++ nie wymaga łapania wyjątków. Tak jest w Javie, ale w C++ możesz napisać:
Kod:
#include <stdio.h>
void rzucacz() { throw (int) 10; }
int main() { try { rzucacz(); } catch (int x) { printf( "%d", x ); } return 0; }

Podział programu na pliki niczego nie zmienia. Przed chwilą to przetestowałem pod Devem (gcc), ale nie wierzę, żeby w innych wersjach kompilatora mogło być inaczej.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Pawel Str.
pijak



Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów

Skąd: Ze starszego roku / Z Gorlic

PostWysłany: Śro 20:27, 17 Maj 2006    Temat postu:

Podział nie ma znaczenia. Robienie czegoś takiego, jak
try{
..
throw float(5);
...
}
catch (int x){
}

Tylko po to, żeby mieć catch, nie ma sensu i zaciemnia program.
Throw nie musi być wewnątrz try - jeżeli nie będzie, następuje wyskok z funkcji i szukanie catch tam. Jeżeli się nie da, kolejny wyskok itd. (tak na prawdę wyskoki są robione blokami, nie funkcjami, ale to nie ma znaczenia - funkcja w tym kontekście też jest blokiem).

Dla elegancji można w sygnaturze funkcji dodać throw(int,float,inne,typy,rzucane,z,tej,funkcji)
np

int fcja(int x,float z) throw(int);

int fcja(int x,float z) throw(int){
.. cialo..
}
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Śro 22:21, 17 Maj 2006    Temat postu:

Hm.. Sprawdziłem: niezłapany wyjątek wywołuje funkcję terminate i toto robi jakieś tam ostateczne porządki [zainteresowanych odsyłam do Stroustrupa].
Gramatyka języka C++ mówi, że po try ma być ciąg 1 lub cięcej catch. Ale jak głęboko w try pojawi się throw - to nie ma znaczenia. Wyjątek 'zwinie' stos, aż do złapania.

Co do problemu cheater_a: wyjątki to standardowy sposób na wyłapywanie błędów bibliotecznych (wg Stroustrupa). BTW w przypadku małych programów wykorzystujących wyjątki często tak bywa, że cały main to try{..}catch{..}. Taki język: w pascalu tak nie zrobisz :)

Co do mojego przykładu: nie zrozumieliśy się Panowie [czytajcie całość posta ;)]. Chodziło mi o to, że i w bibliotece można wyłapywać błędy i je obsługiwać. Jeśli tylko jesteśmy w stanie to zrobić to jest ok. Jeśli nie to nie musimy tego robić. Czyli w moim przykładzie mogłem, tak jak napisaliście śmiało pominąć to try w bibliotece.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Czw 0:14, 18 Maj 2006    Temat postu:

Cytat:
w pascalu tak nie zrobisz

Chyba nie twierdzisz, że w FPC nie ma wyjątków? Jeśli tak, to goto Reference Guide page 114 ;P.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Czw 0:43, 18 Maj 2006    Temat postu:

FPC != pascal
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Czw 0:47, 18 Maj 2006    Temat postu:

C != C++
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Pawel Str.
pijak



Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów

Skąd: Ze starszego roku / Z Gorlic

PostWysłany: Czw 0:50, 18 Maj 2006    Temat postu:

Assembler < C < C++ < Java < Python
:-)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
hansu
Nieomylny Admin



Dołączył: 17 Lis 2005
Posty: 1990
Przeczytał: 0 tematów

Skąd: przychodzimy? Czym jestesmy? Dokad zmierzamy?

PostWysłany: Czw 0:52, 18 Maj 2006    Temat postu:

Pascal < minus infinity
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Czw 1:07, 18 Maj 2006    Temat postu:

hansu napisał:
Pascal < minus infinity

Writeln( Pascal );
ERROR, wrong numeric format, out of range :twisted:
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Czw 1:09, 18 Maj 2006    Temat postu:

01101011100011010101010101010101...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Czw 16:42, 18 Maj 2006    Temat postu:

Pawel Str. napisał:
Assembler < C < C++ < Java < Python
:-)

Chyba się zapędziłeś nieco :) Między językami jest tylko porządek częściowy, a zdania typu C++ < Java i Java < Python są bez sensu ze względu na całkowicie różne przeznaczenia tych języków.

Pawel Str. napisał:
Dla elegancji można w sygnaturze funkcji dodać throw(int,float,inne,typy,rzucane,z,tej,funkcji)
np

int fcja(int x,float z) throw(int);

int fcja(int x,float z) throw(int){
.. cialo..
}

A ja nie polecam tego sposobu, lepiej nie deklarować wyjątków. Utrzymywanie takiego kodu jest trudne, ponieważ wyjątki rzucane przez naszą funkcję mogą pochodzić od obiektów lub funkcji wołanych wewnątrz. Jeśli ktoś zmieniłby kod, z którego korzystamy, nasza funkcja może rzucić wyjątek, którego nie deklaruje, co kończy program wywołaniem funkcji unexpected() (można ją ustawić na własną funkcją set_unexpected(), nagłówek <exception>). IMO lepiej w kodzie klienta dodać łapanie dowolnych wyjątków: catch(...). Wyjątkiem (lol :P) jest sytuacja, gdy deklarujemy, że funkcja nie ma prawa rzucić wyjątkiem: throw(). Poza tym, wszystkie rzucane wyjątki powinny być dobrze udokumentowane.
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin