|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysł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 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 :]
|
Wysł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 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
|
Wysł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 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
|
Wysł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 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 :]
|
Wysł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 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
|
Wysłany: Czw 0:43, 18 Maj 2006 Temat postu: |
|
|
FPC != pascal
|
|
Powrót do góry |
|
|
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 :]
|
Wysłany: Czw 0:47, 18 Maj 2006 Temat postu: |
|
|
C != C++
|
|
Powrót do góry |
|
|
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
|
Wysłany: Czw 0:50, 18 Maj 2006 Temat postu: |
|
|
Assembler < C < C++ < Java < Python
:-)
|
|
Powrót do góry |
|
|
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?
|
Wysłany: Czw 0:52, 18 Maj 2006 Temat postu: |
|
|
Pascal < minus infinity
|
|
Powrót do góry |
|
|
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
|
Wysł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 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
|
Wysłany: Czw 1:09, 18 Maj 2006 Temat postu: |
|
|
01101011100011010101010101010101...
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysł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 |
|
|
|
|
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
|