🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.objects
66 messages
66 total messages Page 1 of 2 Started by Przemek Pokrywka Mon, 27 Mar 2006 18:49
Page 1 of 2 • 66 total messages
Wyrzucenie wyjątku, czy zwrócenie null?
#14385
Author: Przemek Pokrywka
Date: Mon, 27 Mar 2006 18:49
32 lines
1808 bytes
Witam,


Mam system, zawierający m.in. klasy:

class Person
	getAge : int

class PersonFinder
	find(name : string) : Person


Metoda find klasy PersonFinder jest wywoływana bardzo często w różnych 
sytuacjach, z kodu pisanego przez różnych autorów. Zdarza się, że kod 
korzystający z tej metody kolekcjonuje zwracane przez nią obiekty Person 
na wypadek potrzeby ich przyszłego użycia.
W tej chwili, gdy metoda nie odnajdzie osoby o zadanym nazwisku, zwraca 
wartość null.

Jak Państwa zdaniem powinna wyglądać optymalna obsługa sytuacji 
wyjątkowej przez tą metodę, gdyby pisać ten system na nowo?
- Czy najlepiej zwracać by wartość null, jak w tej chwili?
- Czy wyrzucać wyjątek?
- Zakładając, że system pisany byłby w Javie, jakiego typu wyjątek - 
checked, czy unchecked?

Z pewnych względów wolałbym nie stosować tu wzorca Null Object (Woolf).

Zapraszam do podzielenia się swoimi uwagami


Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14386
Author: Adam Przybyłek
Date: Mon, 27 Mar 2006 19:36
21 lines
1902 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
news:e09c3r$lg3$1@news.onet.pl...
> [...]
> Jak Państwa zdaniem powinna wyglądać optymalna obsługa sytuacji
> wyjątkowej przez tą metodę, gdyby pisać ten system na nowo?
> - Czy najlepiej zwracać by wartość null, jak w tej chwili?
> - Czy wyrzucać wyjątek?
> - Zakładając, że system pisany byłby w Javie, jakiego typu wyjątek -
> checked, czy unchecked?
>
> Z pewnych względów wolałbym nie stosować tu wzorca Null Object (Woolf).
>

Jezeli wyszukiwana osoba ma prawo nie figurowac w spisie (np. szukam
znajomego w ksiazce telefonicznej, ale nie wiem, czy ma telefon, czy nie) to
nieznalezienie jej nie jest sytuacja wyjatkowa. Nalezy wowczas zwrocic NULL.
Jezeli natomiast wiem, ze osoba powinna byc w spisie, a okaze sie, ze jej
nie ma to jest wyjatek i trzeba rzucic checked exception.

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14387
Author: Przemek Pokrywka
Date: Mon, 27 Mar 2006 20:05
33 lines
2744 bytes
Adam Przybyłek napisał(a):
> Jezeli wyszukiwana osoba ma prawo nie figurowac w spisie (np. szukam
> znajomego w ksiazce telefonicznej, ale nie wiem, czy ma telefon, czy nie) to
> nieznalezienie jej nie jest sytuacja wyjatkowa. Nalezy wowczas zwrocic NULL.

No dobrze, załóżmy więc, że sytuacja nie jest wyjątkowa - zwrócę NULL. 
Co ma zrobić w tej sytuacji kod wywołujący metodę find?
Jednym z wyjść (bardzo popularnym) jest optymistyczne założenie, że 
udało się znaleźć znajomego. Teraz w lepszym przypadku kod usiłuje 
następnie wywołać na nim metodę getAge, co prowadzi do łatwego do 
znalezienia błędu.
W gorszym przypadku, kod zapamiętuje tego (jak sądzi) "znajomego" w 
pewnej kolekcji. Po dłuższym czasie działania programu po kolekcji tej 
iteruje inny wątek, wywołując metodę getAge na każdym elemencie. Nagle 
okazuje się, że wystąpił błąd. Gdzie leży jego przyczyna, gdy kolekcja 
jest aktualizowana z bardzo wielu miejsc programu?

Odporny na błędy kod sprawdzi oczywiście, czy wartość zwrócona przez 
find nie jest aby NULLem. Czy jednak kod upstrzony wieloma warunkami if 
jest bardziej czytelny i lepiej wyraża intencję autora od kodu 
zawierającego klauzule obsługi wyjątków? Czy enigmatyczny "NULL" lepiej 
komunikuje fakt nieodnalezienia obiektu od wyjątku o nazwie 
PersonNotFoundException? Nie sądzę, i dlatego uważam, że teza postaci:

"ma prawo nie zostać odnaleziona" => "nieodnalezienie jej nie jest 
sytuacją wyjątkową" => "nie należy zgłaszać wyjątku"

nie jest prawdziwa (ze względu na drugą implikację).

Zapraszam jednak do dzielenia się innymi argumentami, gdyby ktoś doszedł 
do innych wniosków.

Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14388
Author: Marcin 'Qrczak' Kowalczyk
Date: Mon, 27 Mar 2006 21:44
22 lines
2206 bytes
Przemek Pokrywka <adres@zastrzezony.com> writes:

> No dobrze, załóżmy więc, że sytuacja nie jest wyjątkowa - zwrócę NULL.
> Co ma zrobić w tej sytuacji kod wywołujący metodę find?

Nie da się odpowiedzieć na tak ogólne pytanie. Zależy, jakie
zachowanie jest po nim oczekiwane.

> Odporny na błędy kod sprawdzi oczywiście, czy wartość zwrócona przez
> find nie jest aby NULLem. Czy jednak kod upstrzony wieloma warunkami
> if jest bardziej czytelny i lepiej wyraża intencję autora od kodu
> zawierającego klauzule obsługi wyjątków?

Jeśli sytuacja, kiedy elementu nie ma w spisie, jest normalna, to tak.
Jeśli jest wyjątkowa i w takim przypadku należy przerwać dalsze
obliczenia dużej części programu, to nie. (Dobry interfejs spisu
udostępnia takie i takie wyszukiwanie.)

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14390
Author: x-plorer
Date: Tue, 28 Mar 2006 10:06
46 lines
2883 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości 
news:e09gjn$737$1@news.onet.pl...

> uważam, że teza postaci:
>
> "ma prawo nie zostać odnaleziona" => "nieodnalezienie jej nie jest 
> sytuacją wyjątkową" => "nie należy zgłaszać wyjątku"
>
> nie jest prawdziwa (ze względu na drugą implikację).
>
> Zapraszam jednak do dzielenia się innymi argumentami, gdyby ktoś doszedł 
> do innych wniosków.


Witam. Pozwolę sobie zaprezentować zdanie odmienne. Moje argumenty:

1. Już samo określenie wyjątek sugeruje, że chodzi o sytuację rzadko 
spotykaną. Nieznalezienie obiektu jest w opisanym przypadku równie 
uprawnione jak jego znalezienie. Sytuacja daje się łatwo obsłużyć w językach 
bez obsługi wyjątków. (To argument dość subiektywny, więc nie 
najmocniejszy.)

2. Czytelność kodu. Uważam, że linia postaci:

if (person == null) // nie znaleziono osoby

jest bardziej czytelna niż blok chwytania wyjątku.

3. Efektywność. Porównanie z nullem to fizycznie banalne sprawdzenie. 
Rzucanie i chwytanie wyjątku jest kosztowne. Nie wytaczajmy armaty na 
wróble.

Posłużenie się wyjątkiem miałoby wg mnie sens w następującej sytuacji:

W przebiegu może zajść więcej negatywnych zdarzeń, np. brak uprawnień do 
danych osoby, dane osoby uniemozliwiają przeprowadzenie dalszych obliczeń 
(np. obliczenie dni urlopu dla emeryta) itp. W takiej sytuacji można 
załatwić wszystkie możliwe wyjątki jednym blokiem przechwytywania, pod 
warunkiem, że ich sposób obsłużenia będzie identyczny niezależnie od typu 
wyjątku, np. opis wyjątku jest czytelny dla użytkownika i wystarczy 
wyświetlić go w oknie komunikatu.

Pozdrawiam

x-plorer 
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14391
Author: Przemek Pokrywka
Date: Tue, 28 Mar 2006 21:05
103 lines
5956 bytes
Dziękuję za ciekawą wypowiedź, choć zgadzam się z nią w (mniej więcej) 
połowie

x-plorer napisał(a):
> 1. Już samo określenie wyjątek sugeruje, że chodzi o sytuację rzadko 
> spotykaną. Nieznalezienie obiektu jest w opisanym przypadku równie 
> uprawnione jak jego znalezienie.

Najpierw spróbuję pokazać, że branie określenia "wyjątek" dosłownie może 
nieść za sobą niebezpieczeństwo zignorowania jego istoty jako 
konstrukcji programistycznej.

Choć wprawdzie te dwie sytuacje są równouprawnione, to bywa, że język 
traktuje je nierówno. Przy okazji może wyjść tu moje skażenie Javą i 
przyzwyczajeniem do wyjątków sprawdzanych przez kompilator (AFIK rzadko 
występujących w popularnych językach programowania).
Otóż w wypadku nieodnalezienia obiektu, gdy
a) zwrócony jest null, nic nie powstrzyma roztargnionego programisty 
przed zignorowaniem takiej sytuacji, co najprawdopodobniej zakończy się 
błędem w znacznie dalszej części programu, gdzie znalezienie go nie 
będzie już takie oczywiste.
b) wyrzucony jest wyjątek sprawdzany przez kompilator, błąd kompilacji 
uniemożliwi roztargnionemu programiście przejście dalej

W przypadku wyrzucenia wyjątku programista jest więc wspierany przez 
kompilator w prawidłowej obsłudze wszystkich przypadków.
Owszem, zdarzają się ludzie, którzy po błędzie kompilacji szybko 
dopisują pustą klauzulę catch, ale nie mam takich na myśli.

Następnie chciałbym wykazać, że równouprawnienie dwóch sytuacji nie jest 
wystarczającą przesłanką, żeby nie używać wyjątków.
W aplikacjach, które często operują na plikach na każdym kroku może 
wystąpić sytuacja błędu odczytu/zapisu/nieodnalezienia pliku. Pomimo, że 
zarówno sytuacja odnalezienia pliku, jak i ta przeciwna są 
równouprawnione, zakłada się jednak jakiś podstawowy scenariusz 
działania aplikacji, w którym dobrze wykona ona zadania, do których jest 
przeznaczona. Prawdziwe równouprawnienie przypadków niemal nie występuje 
w praktyce. Przy takich założeniach kod, który w głównym "nurcie" 
rozpatruje te pozytywne przypadki, a w klauzulach obsługi wyjątków 
zajmuje się tymi negatywnymi jest moim zdaniem bardziej czytelny, niż 
kod, który w równouprawnionych gałęziach instrukcji warunkowej 
rozpatruje przypadek podstawowy i alternatywny.
Innymi słowy, użycie instrukcji warunkowej do odróżnienia przypadków 
podstawowego i alternatywnego jest dla mnie "zbyt łaskawym" 
potraktowaniem przypadku alternatywnego.
O prawdziwym równouprawnieniu dwóch przypadków możnaby mówić moim 
zdaniem np. w określaniu płci osoby (i to tylko w aplikacjach, których 
zasadnicze działanie jest niezależnie od tego atrybutu osoby).

> 2. Czytelność kodu. Uważam, że linia postaci:
> 
> if (person == null) // nie znaleziono osoby
> 
> jest bardziej czytelna niż blok chwytania wyjątku.

twierdzę, że od

Person person = find("nemo");
if (person != null)
	process(person);
else
	noPersonFoundCase();

czytelniejsze jest:
try {
	Person person = find("nemo");
	process(person);
catch (PersonNotFoundException e) {
	noPersonFoundCase();
}

dlatego, że w drugim przypadku można w sposób niezakłócony prześledzić 
proces wyszukiwania i przetwarzania obiektu Person z jasno oddzieloną 
obsługą sytuacji wyjątkowej.

> 3. Efektywność. Porównanie z nullem to fizycznie banalne sprawdzenie. 
> Rzucanie i chwytanie wyjątku jest kosztowne. Nie wytaczajmy armaty na 
> wróble.

"Premature optimization is the root of all evil" jak powiedział mistrz 
Knuth - jak zawsze, diabeł tkwi w szczegółach. Rezygnacja z lepszej 
konstrukcji językowej na rzecz niejasnych korzyści wydajnościowych nie 
jest moim zdaniem dobrą praktyką. Jeśli profiling aplikacji wykaże, że 
obsługa wyjątków jest wąskim gardłem, to zgodziłbym się, że w danej 
sytuacji użycie wyjątków może nie być najlepszym wyjściem. Idę jednak o 
zakład, że wyjątki nie stanowią wąskiego gardła w 80% aplikacji.

> Posłużenie się wyjątkiem miałoby wg mnie sens w następującej sytuacji:
> 
> W przebiegu może zajść więcej negatywnych zdarzeń, np. brak uprawnień do 
> danych osoby, dane osoby uniemozliwiają przeprowadzenie dalszych obliczeń 
> (np. obliczenie dni urlopu dla emeryta) itp. W takiej sytuacji można 
> załatwić wszystkie możliwe wyjątki jednym blokiem przechwytywania, pod 
> warunkiem, że ich sposób obsłużenia będzie identyczny niezależnie od typu 
> wyjątku, np. opis wyjątku jest czytelny dla użytkownika i wystarczy 
> wyświetlić go w oknie komunikatu.

Zgadzam się z takim wnioskiem - jednak opisana sytuacja to dla mnie nie 
jest jedyna, w której widziałbym uzasadnienie dla użycia wyjątków.

--
Pozdrawiam,
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14389
Author: Przemek Pokrywka
Date: Tue, 28 Mar 2006 21:19
36 lines
2487 bytes
Marcin 'Qrczak' Kowalczyk napisał(a):
> Przemek Pokrywka <adres@zastrzezony.com> writes:
> 
> 
>>No dobrze, załóżmy więc, że sytuacja nie jest wyjątkowa - zwrócę NULL.
>>Co ma zrobić w tej sytuacji kod wywołujący metodę find?
> 
> 
> Nie da się odpowiedzieć na tak ogólne pytanie. Zależy, jakie
> zachowanie jest po nim oczekiwane.

Najprościej ujmując, oczekiwane jest prawidłowe obsłużenie obydwu 
sytuacji. Najczęściej (choć nie zawsze) oznaczać to będzie występowanie 
jakiegoś rodzaju identyfikacji (if, try/catch, ...) danego przypadku w 
okolicach wywołania metody find.

>>Odporny na błędy kod sprawdzi oczywiście, czy wartość zwrócona przez
>>find nie jest aby NULLem. Czy jednak kod upstrzony wieloma warunkami
>>if jest bardziej czytelny i lepiej wyraża intencję autora od kodu
>>zawierającego klauzule obsługi wyjątków?
> 
> 
> Jeśli sytuacja, kiedy elementu nie ma w spisie, jest normalna, to tak.
> Jeśli jest wyjątkowa i w takim przypadku należy przerwać dalsze
> obliczenia dużej części programu, to nie. (Dobry interfejs spisu
> udostępnia takie i takie wyszukiwanie.)
> 

W zasadzie zgodzę się ze wszystkimi Pana wnioskami. Sęk jednak w tym, że 
niemal nie spotyka się sytuacji w 100% równouprawnionych. Oczywiście, 
jednak czasem takie się zdarzają i dlatego uważam za słuszną uwagę o 
dobrym interfejsie spisu.

--
Pozdrawiam,
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14392
Author: Adam Przybyłek
Date: Tue, 28 Mar 2006 22:20
21 lines
2130 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
news:e0c8eh$ur8$1@news.onet.pl...
>
> [...]
> W aplikacjach, które często operują na plikach na każdym kroku może
> wystąpić sytuacja błędu odczytu/zapisu/nieodnalezienia pliku. Pomimo, że
> zarówno sytuacja odnalezienia pliku, jak i ta przeciwna są
> równouprawnione, zakłada się jednak jakiś podstawowy scenariusz
> działania aplikacji, w którym dobrze wykona ona zadania, do których jest
> przeznaczona.

Blad odczytu/zapisu to wlasnie sytuacja nietypowa. Normalnie zapisujac plik
na dysku oczekujesz, ze zapis sie uda. Co innego odnalezienie pliku.
Wyswietlasz okienko zeby uzytkownik wpisal plik, ktory chce otworzyc. Jezeli
plik taki nie istnieje to nie jest zaden wyjatek i prosisz uzytkownika, aby
wprowadzil inna nazwe pliku. Jesli natomiast plik podany przez uzytkownika
istnieje, ale z jakichs wzgledow nie moze byc odczytany, np. bad sector to
wtedy jest sytuacja wyjatkowa i rzucany jest wyjatek.

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14393
Author: Przemek Pokrywka
Date: Tue, 28 Mar 2006 22:47
41 lines
3015 bytes
Adam Przybyłek napisał(a):
> Blad odczytu/zapisu to wlasnie sytuacja nietypowa. Normalnie zapisujac plik
> na dysku oczekujesz, ze zapis sie uda.

Tak, w zupełności.

> Co innego odnalezienie pliku.

Doprawdy?

> Wyswietlasz okienko zeby uzytkownik wpisal plik, ktory chce otworzyc. Jezeli
> plik taki nie istnieje to nie jest zaden wyjatek i prosisz uzytkownika, aby
> wprowadzil inna nazwe pliku. 

A co, jeśli nie wyjątek? Użytkownik nie wpisuje nazwy pliku, o którym 
wie, że nie istnieje. Jeśli ten plik wbrew jego przekonaniom nie 
istnieje, lub on sam się pomylił, to jest to dla niego sytuacja 
niespodziewana i nie można jej uznać za sytuację "normalną".

Sens wyboru właściwej opcji (wyjątek/instrukcja warunkowa) da się 
zrozumieć przechodząc do kodu, który w wypadku użycia wyjątków czyta się 
znacznie naturalniej i który w bardziej przejrzysty sposób uwidacznia 
swoje intencje.

> Jesli natomiast plik podany przez uzytkownika
> istnieje, ale z jakichs wzgledow nie moze byc odczytany, np. bad sector to
> wtedy jest sytuacja wyjatkowa i rzucany jest wyjatek.

Po lekturze tego zdania odnoszę wrażenie, że zakładasz istnienie 
jakiegoś pojedynczego, zunifikowanego sposobu obsługi wyjątków: "rzucany 
jest wyjątek" nasuwa mi skojarzenia z jakimś okienkiem dialogowym z 
napisem "Unhandled exception", nic nie mówiącym numerem i przyciskiem 
"ok", albo z niebieskim ekranem ;) - na ile się orientuję, jest to 
popularny sposób obsługi błędów w aplikacjach C# będących w trakcie rozwoju.
Jeśli tak, to nic bardziej błędnego - ja zakładam, że wszystkie wyjątki 
są pod ścisłą kontrolą aplikacji, która może w przypadku ich wystąpienia 
np. poprosić użytkownika o inną nazwę pliku, ukrywając przed nim fakt 
wystąpienia jakiegokolwiek wyjątku.

--
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14394
Author: Adam Przybyłek
Date: Wed, 29 Mar 2006 06:41
31 lines
2122 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
news:e0ced6$f7g$1@news.onet.pl...
> Adam Przybyłek napisał(a):
> > Blad odczytu/zapisu to wlasnie sytuacja nietypowa. Normalnie zapisujac
plik
> > na dysku oczekujesz, ze zapis sie uda.
>
> Tak, w zupełności.
>
> > Co innego odnalezienie pliku.
>
> Doprawdy?
>
> > Wyswietlasz okienko zeby uzytkownik wpisal plik, ktory chce otworzyc.
Jezeli
> > plik taki nie istnieje to nie jest zaden wyjatek i prosisz uzytkownika,
aby
> > wprowadzil inna nazwe pliku.
>
> A co, jeśli nie wyjątek? Użytkownik nie wpisuje nazwy pliku, o którym
> wie, że nie istnieje. Jeśli ten plik wbrew jego przekonaniom nie
> istnieje, lub on sam się pomylił, to jest to dla niego sytuacja
> niespodziewana i nie można jej uznać za sytuację "normalną".
>

Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
File myFile = new File("nazwaPliku");
if (myFile.exists() ){ ... }

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14396
Author: Marcin 'Qrczak' Kowalczyk
Date: Wed, 29 Mar 2006 06:59
13 lines
1833 bytes
"Adam Przybyłek" <adampap@panda.bg.univ.gda.pl> writes:

> Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
> File myFile = new File("nazwaPliku");
> if (myFile.exists() ){ ... }

A jeśli w momencie sprawdzania jeszcze istnieje, ale w momencie
otwierania już nie?

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14398
Author: Adam Przybyłek
Date: Wed, 29 Mar 2006 15:19
16 lines
1727 bytes
Użytkownik "Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> napisał w
wiadomości news:87y7ytka81.fsf@qrnik.zagroda...
> "Adam Przybyłek" <adampap@panda.bg.univ.gda.pl> writes:
>
> > Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
> > File myFile = new File("nazwaPliku");
> > if (myFile.exists() ){ ... }
>
> A jeśli w momencie sprawdzania jeszcze istnieje, ale w momencie
> otwierania już nie?
>

No to wtedy juz jest sytuacja nieoczekiwana i na ta okolicznosc przewidziany
jest wyjatek.

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14399
Author: Michal Przybylek
Date: Wed, 29 Mar 2006 17:24
17 lines
1733 bytes
"Adam Przybyłek" <adampap@panda.bg.univ.gda.pl> wrote:

> > > Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
> > > File myFile = new File("nazwaPliku");
> > > if (myFile.exists() ){ ... }
> >
> > A jeśli w momencie sprawdzania jeszcze istnieje, ale w momencie
> > otwierania już nie?
> >
>
> No to wtedy juz jest sytuacja nieoczekiwana i na ta okolicznosc
> przewidziany jest wyjatek.

Zupelnie bez sensu. Ten pierwszy test wtedy czegokolwiek nie daje.


mp
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14400
Author: Adam Przybyłek
Date: Wed, 29 Mar 2006 18:00
26 lines
2192 bytes
Użytkownik "Michal Przybylek" <mrp@neostrada.pl> napisał w wiadomości
news:e0ef6i$h84$1@nemesis.news.tpi.pl...
> "Adam Przybyłek" <adampap@panda.bg.univ.gda.pl> wrote:
>
> > > > Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
> > > > File myFile = new File("nazwaPliku");
> > > > if (myFile.exists() ){ ... }
> > >
> > > A jeśli w momencie sprawdzania jeszcze istnieje, ale w momencie
> > > otwierania już nie?
> > >
> >
> > No to wtedy juz jest sytuacja nieoczekiwana i na ta okolicznosc
> > przewidziany jest wyjatek.
>
> Zupelnie bez sensu. Ten pierwszy test wtedy czegokolwiek nie daje.
>

Ale elegancko wyglada. Bo na pierwszym lapiesz sytuacje typu ktos zrobil
literowke podajac nazwe pliku.
A sytuacja, ze pierwszy test zakonczy sie powodzeniem, a potem w ulamku
sekundy ktos skasuje plik zanim zdarzysz go otworzyc jest wyjatkowa i na ta
okazje przygotowano wyjatki.

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14401
Author: Przemek Pokrywka
Date: Wed, 29 Mar 2006 18:31
38 lines
2710 bytes
Adam Przybyłek napisał(a):
> Użytkownik "Michal Przybylek" <mrp@neostrada.pl> napisał w wiadomości
> news:e0ef6i$h84$1@nemesis.news.tpi.pl...
> 
>>"Adam Przybyłek" <adampap@panda.bg.univ.gda.pl> wrote:
>>
>>
>>>>>Po wprowadzeniu przez uzytkownika nazwy pliku robisz:
>>>>>File myFile = new File("nazwaPliku");
>>>>>if (myFile.exists() ){ ... }
>>>>
>>>>A jeśli w momencie sprawdzania jeszcze istnieje, ale w momencie
>>>>otwierania już nie?
>>>>
>>>
>>>No to wtedy juz jest sytuacja nieoczekiwana i na ta okolicznosc
>>>przewidziany jest wyjatek.
>>
>>Zupelnie bez sensu. Ten pierwszy test wtedy czegokolwiek nie daje.
>>
> 
> 
> Ale elegancko wyglada. Bo na pierwszym lapiesz sytuacje typu ktos zrobil
> literowke podajac nazwe pliku.
> A sytuacja, ze pierwszy test zakonczy sie powodzeniem, a potem w ulamku
> sekundy ktos skasuje plik zanim zdarzysz go otworzyc jest wyjatkowa i na ta
> okazje przygotowano wyjatki.

I bez sensu, i nieelegancko. Próba odczytu pliku sprawdza też jego 
istnienie, więc test w instrukcji warunkowej jest zduplikowany (a na 
dodatek zbędny). Sprawdzenie zaciemnia tylko obraz pozytywnego 
scenariusza działania aplikacji.
Nie wiem, czemu ma ono służyć - zademonstrowaniu innym programistom 
czytającym kod, że owszem, przewiduje się sytuację pomyłki użytkownika? 
Bo żadnych korzyści z punktu widzenia poprawnego działania aplikacji nie ma.

--
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14402
Author: Adam Przybyłek
Date: Wed, 29 Mar 2006 19:01
19 lines
2053 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
news:e0ejpu$27n$1@news.onet.pl...

>
> I bez sensu, i nieelegancko. Próba odczytu pliku sprawdza też jego
> istnienie, więc test w instrukcji warunkowej jest zduplikowany (a na
> dodatek zbędny). Sprawdzenie zaciemnia tylko obraz pozytywnego
> scenariusza działania aplikacji.
> Nie wiem, czemu ma ono służyć - zademonstrowaniu innym programistom
> czytającym kod, że owszem, przewiduje się sytuację pomyłki użytkownika?
> Bo żadnych korzyści z punktu widzenia poprawnego działania aplikacji nie
ma.
>

Nieelegancko, bo chcesz sprowadzic "try" do poziomu instrukcji sterujacych
"if", "for", "while".

Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14403
Author: Przemek Pokrywka
Date: Wed, 29 Mar 2006 19:08
11 lines
1696 bytes
Adam Przybyłek napisał(a):
> Nieelegancko, bo chcesz sprowadzic "try" do poziomu instrukcji sterujacych
> "if", "for", "while".

A czy w ten sposób ujmę mu czegokolwiek? :)
W trakcie programowania z uwagą wsłuchuję się w mój kod i słyszałem już 
od niego różne skargi, ale jak do tej pory nie dotarły do mnie żadne ze 
strony "try" :)

--
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14404
Author: Grzesiek G.
Date: Thu, 30 Mar 2006 14:48
56 lines
2584 bytes
Przemek Pokrywka napisał(a):
> Adam Przybyłek napisał(a):
> 
>> Nieelegancko, bo chcesz sprowadzic "try" do poziomu instrukcji 
>> sterujacych
>> "if", "for", "while".
> 
> 
> A czy w ten sposób ujmę mu czegokolwiek? :)
> W trakcie programowania z uwagą wsłuchuję się w mój kod i słyszałem już 
> od niego różne skargi, ale jak do tej pory nie dotarły do mnie żadne ze 
> strony "try" :)

Niektórzy uważają, że sytuacje wyjątkowe to te, które nie wynikają z 
dokumentacji. Jeżeli więc dokumentacja mówi, że program ma sprawdzić czy 
plik istnieje, to można powinien być kod typu

if(File(filePath).Exists)
{
	try
	{
		using(File f = new File(filePath))
		{
			//tu operacje na pliku
		}
	}
	catch(Exception)
	{
		//obsłużenie nieoczekiwanego błędu
	}
}
else
{
	//np. ponowne pobranie ścieżki
}

A jeżeli założymy że dokumentacja nie mówi, że program nie ma sprawdzać 
istnienia pliku, to po prostu:

	try
	{
		using(File f = new File(filePath))
		{
			//tu operacje na pliku
		}
	}
	catch(Exception)
	{
		//obsłużenie nieoczekiwanego błędu
	}

Pozdrawiam
			
-- 
Grzegorz Gruza
Odpowiadając usuń "spamerom_nie." z adresu!!!
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14405
Author: Michal Przybylek
Date: Thu, 30 Mar 2006 19:03
17 lines
1996 bytes
"Grzesiek G." <gruza@spamerom_nie.priv4.onet.pl> wrote:

> Jeżeli więc dokumentacja mówi, że program ma sprawdzić czy
> plik istnieje, to można powinien być kod typu

Zupelnie bez sensu.

Jezeli po "elese" stoi to samo co w "catch" to zmarnowalismy kilka linii
kodu, bo program zachowuje sie identycznie.

Jezeli zas stoi cos innego, to program staje sie "nieciagly". Tzn. male
zaburzenia w czasie wykonywania akcji, powoduja, ze zachowanie programu jest
inne. Program dziala niedeterministycznie (nie jestesmy w stanie przewidziec
wyniku).


mp
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14485
Author: Adam Przybyłek
Date: Thu, 30 Mar 2006 21:53
15 lines
1902 bytes
Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
news:e0elup$ad0$1@news.onet.pl...
> Adam Przybyłek napisał(a):
> > Nieelegancko, bo chcesz sprowadzic "try" do poziomu instrukcji
sterujacych
> > "if", "for", "while".
>
> A czy w ten sposób ujmę mu czegokolwiek? :)
> W trakcie programowania z uwagą wsłuchuję się w mój kod i słyszałem już
> od niego różne skargi, ale jak do tej pory nie dotarły do mnie żadne ze
> strony "try" :)
>

"Try" to jest taki ukrytu "GO TO".
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14491
Author: Aleksander Galicki
Date: Thu, 30 Mar 2006 22:37
24 lines
1786 bytes
>
>Użytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisał w wiadomości
>news:e0elup$ad0$1@news.onet.pl...
>> Adam Przybyłek napisał(a):
>> > Nieelegancko, bo chcesz sprowadzic "try" do poziomu instrukcji
>sterujacych
>> > "if", "for", "while".
>>
>> A czy w ten sposób ujmę mu czegokolwiek? :)
>> W trakcie programowania z uwagą wsłuchuję się w mój kod i słyszałem już
>> od niego różne skargi, ale jak do tej pory nie dotarły do mnie żadne ze
>> strony "try" :)
>>
>
>"Try" to jest taki ukrytu "GO TO".

Slucham..?


A.
-- 
============= P o l N E W S ==============
     archiwum i przeszukiwanie newsów
        http://www.polnews.pl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14406
Author: Grzesiek G.
Date: Fri, 31 Mar 2006 06:18
38 lines
2916 bytes
Michal Przybylek napisał(a):
> "Grzesiek G." <gruza@spamerom_nie.priv4.onet.pl> wrote:
> 
> 
>>Jeżeli więc dokumentacja mówi, że program ma sprawdzić czy
>>plik istnieje, to można powinien być kod typu
> 
> 
> Zupelnie bez sensu.
> 
> Jezeli po "elese" stoi to samo co w "catch" to zmarnowalismy kilka linii
> kodu, bo program zachowuje sie identycznie.
> 

Nie zawsze. Bo jeżeli np. wcześniej wspomniany plik powinno się dać 
otworzyć (sprawdzone if-em) a się nie daje, to program może głośno 
krzyczeć, a jeżeli sprawdzenie if-em nie wyjdzie to delikatnie 
sugerować. Jeżeli użytkownik tak chce (i za to płaci :-)) i jest to tak 
opisane w dokumentacji to czemu taka implementacja jest zła?

> Jezeli zas stoi cos innego, to program staje sie "nieciagly". Tzn. male
> zaburzenia w czasie wykonywania akcji, powoduja, ze zachowanie programu jest
> inne. Program dziala niedeterministycznie (nie jestesmy w stanie przewidziec
> wyniku).

Nie bardzo rozumiem. Co to są małe zaburzenia? Być może na podstawie 
przedstawionego przeze mnie pseudokodu nie jesteśmy w stanie przewidzieć 
wyniku, ale wrzuciłem go tylko dla ilustracji.

Ja po prostu prezentuję swój pogląd znajdujący się pomiędzy 
bezwzględnymi: "zawsze if" oraz "zawsze wyjątek". I nie jestem jedyny z 
takim poglądem, w tym wątku.

Pozdrawiam

-- 
Grzegorz Gruza
Odpowiadając usuń "spamerom_nie." z adresu!!!
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14407
Author: Przemek Pokrywka
Date: Fri, 31 Mar 2006 21:28
32 lines
2661 bytes
Grzesiek G. napisał(a):
> Niektórzy uważają, że sytuacje wyjątkowe to te, które nie wynikają z 
> dokumentacji. Jeżeli więc dokumentacja mówi, że program ma sprawdzić czy 
> plik istnieje, to można powinien być kod typu
> 
[...]

Zgaduję, że intencją Kolegi było zaznaczenie, że klient (który płaci i 
wymaga) życzy sobie rozgraniczania sytuacji nieodnalezienia pliku od 
wystąpienia innych błędów wejścia/wyjścia. Zdanie o kliencie, który 
umieszcza w dokumentacji nakaz sprawdzenia występowania pliku budzi we 
mnie skrajne emocje - od pokładania się ze śmiechu z absurdalnego żartu 
po osłupienie z przerażenia nad jego bezdennym idiotyzmem. Któż na 
świecie interesuje się tym, co robi w środku metoda (jeśli tylko 
wykonuje swoje zadanie).

Zarówno w przypadku gdy klient życzy sobie rozróżniania tych przypadków 
na poziomie sygnatury metody (w jakikolwiek sposób), jak i wtedy, gdy 
jest mu to obojętne, daje się to elegancko obsłużyć za pomocą wyjątków.

try {
	// operacje na plikach
	// ...
} catch (FileNotFoundException notFound) {
	// obsługa braku pliku na dysku
} catch (IOException otherIO) {
	// obsługa innych błędów wejścia/wyjścia
}

--
Pozdrawiam,
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14408
Author: Grzesiek G.
Date: Mon, 03 Apr 2006 12:51
64 lines
4352 bytes
Przemek Pokrywka napisał(a):
> Grzesiek G. napisał(a):
> 
>> Niektórzy uważają, że sytuacje wyjątkowe to te, które nie wynikają z 
>> dokumentacji. Jeżeli więc dokumentacja mówi, że program ma sprawdzić 
>> czy plik istnieje, to można powinien być kod typu
>>
> [...]
> 
> Zgaduję, że intencją Kolegi było zaznaczenie, że klient (który płaci i 
> wymaga) życzy sobie rozgraniczania sytuacji nieodnalezienia pliku od 
> wystąpienia innych błędów wejścia/wyjścia. Zdanie o kliencie, który 
> umieszcza w dokumentacji nakaz sprawdzenia występowania pliku budzi we 
> mnie skrajne emocje - od pokładania się ze śmiechu z absurdalnego żartu 
> po osłupienie z przerażenia nad jego bezdennym idiotyzmem. Któż na 
> świecie interesuje się tym, co robi w środku metoda (jeśli tylko 
> wykonuje swoje zadanie).
> 

Ale zadanie wykonywane przez program to jest coś, co jest opisane w 
jakimś dokumencie. Więc jeżeli nikt nie napisał, że sprawdzanie 
istnienia pliku jest częścią zadania, to (według przedstawionej przeze 
mnie teorii) jest sytuacją wyjątkową i można ją śmiało obsłużyć przez catch.

Co do tezy, że klient nie interesuje się tym co robi w środku metoda się 
zgadzam. Jednak klienta interesuje jak robi. Więc jeśli robi zbyt wolno, 
bo przebieg programu jest sterowany wyjątkami, to klient może się 
zainteresować.

Problem istnienia pliku jest tu tylko problemem hipotetycznym, którym 
posłużyłem w nawiązaniu do odpowiedzi przedmówcy.

Takiego klienta, który to specyfikuje, też nie spotkałem, ale mam często 
taki przypadek: klient chce żeby aplikacja importowała dane z pliku do 
własnego serwera bazy danych. Import może się nie powieść z powodu 
błędnej zawartości pliku. Błąd jest sygnalizowany przez serwer bazy 
danych w sposób nieczytelny dla zwykłego użytkownika. Jeżeli użytkownik 
chce widzieć błąd w sposób czytelny (bo np. plik jest tworzony ręcznie) 
to i tak trzeba dorzucić ręczną walidację opartą na ifach.


> Zarówno w przypadku gdy klient życzy sobie rozróżniania tych przypadków 
> na poziomie sygnatury metody (w jakikolwiek sposób), jak i wtedy, gdy 
> jest mu to obojętne, daje się to elegancko obsłużyć za pomocą wyjątków.
> 
> try {
>     // operacje na plikach
>     // ...
> } catch (FileNotFoundException notFound) {
>     // obsługa braku pliku na dysku
> } catch (IOException otherIO) {
>     // obsługa innych błędów wejścia/wyjścia
> }

Tutaj jasnym jest, że tak elegancko to można zrobić, bo istnieje wyjątek 
FileNotFound i bardziej ogólny IOExcpeption. Ale co w sytuacji, gdy 
wszystkie błędy wywoływania zapytań bazy danych zwracają wyjątek 
SqlException?

Pozdrawiam

-- 
Grzegorz Gruza
Odpowiadając usuń "spamerom_nie." z adresu!!!
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14409
Author: Marcin 'Qrczak' Kowalczyk
Date: Mon, 03 Apr 2006 13:18
21 lines
2731 bytes
"Grzesiek G." <gruza@spamerom_nie.priv4.onet.pl> writes:

> Ale zadanie wykonywane przez program to jest coś, co jest opisane
> w jakimś dokumencie. Więc jeżeli nikt nie napisał, że sprawdzanie
> istnienia pliku jest częścią zadania, to (według przedstawionej
> przeze mnie teorii) jest sytuacją wyjątkową i można ją śmiało
> obsłużyć przez catch.

To, sytuacja była przewidziana w specyfikacji na którymś poziomie
abstrakcji, nie ma nic do rzeczy.

Warto użyć wyjątków wtedy, kiedy obsługa sytuacji będzie zwykle
daleko od miejsca jej wykrycia, czyli kiedy bezpośrednim skutkiem tej
sytuacji będzie przerwanie części obliczeń, oraz (w części języków,
m.in. w C++ i Javie, w których rzucanie wyjątków jest względnie
drogie) kiedy ta sytuacja jest rzadka.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14482
Author: Przemek Pokrywka
Date: Mon, 03 Apr 2006 21:09
57 lines
4605 bytes
Grzesiek G. napisał(a):
> Ale zadanie wykonywane przez program to jest coś, co jest opisane w 
> jakimś dokumencie. Więc jeżeli nikt nie napisał, że sprawdzanie 
> istnienia pliku jest częścią zadania, to (według przedstawionej przeze 
> mnie teorii) jest sytuacją wyjątkową i można ją śmiało obsłużyć przez 
> catch.
> 
> Co do tezy, że klient nie interesuje się tym co robi w środku metoda się 
> zgadzam. Jednak klienta interesuje jak robi. Więc jeśli robi zbyt wolno, 
> bo przebieg programu jest sterowany wyjątkami, to klient może się 
> zainteresować.

Przedstawiona teoria jest dla mnie bardzo naciągana, z tego powodu, że 
klient, jeśli mu zależy na wydajności, to napisze o tym wprost, i to w 
odniesieniu do konkretnych przypadków użycia, a nie w postaci stwierdzeń 
na temat obsługi wyjątków w ciałach poszczególnych metod.
Wyjątki mogą stanowić problem wydajnościowy w marginalnych wypadkach i 
tylko raport narzędzia typu profiler może stanowić przesłankę do 
zastąpienia ich czymś innym. Byłbym bardzo zainteresowany usłyszeniem o 
przypadku, w którym u kogoś to faktycznie obsługa wyjątków pod względem 
wydajności stanowiła wąskie gardło systemu, przez co system nie spełniał 
wymagań wydajnościowych postawionych mu przez klienta.
Jeszcze raz za mistrzem Knuthem powtórzę, że "premature optimization is 
the root of all evil"

> Takiego klienta, który to specyfikuje, też nie spotkałem, ale mam często 
> taki przypadek: klient chce żeby aplikacja importowała dane z pliku do 
> własnego serwera bazy danych. Import może się nie powieść z powodu 
> błędnej zawartości pliku. Błąd jest sygnalizowany przez serwer bazy 
> danych w sposób nieczytelny dla zwykłego użytkownika. Jeżeli użytkownik 
> chce widzieć błąd w sposób czytelny (bo np. plik jest tworzony ręcznie) 
> to i tak trzeba dorzucić ręczną walidację opartą na ifach.

Jasne, bywa, że wyjątek wyrzucany przez sterownik JDBC, czy jakąkolwiek 
inną bibliotekę nie niesie ze sobą informacji istotnych z punktu 
widzenia użytkownika (choć bywa tak rzadko, bo przeważnie można taki 
wyjątek przechwycić, opakować w swój własny uzupełniający informację i 
obsłużyć go we właściwym miejscu programu). Czasem jednak tak bywa i 
walidację trzeba przeprowadzić wcześniej, gdy informacje interesujące 
użytkownika (np. zawartość pliku) są jeszcze dostępne. Jest to właśnie 
domena instrukcji typu "if" i nie zamierzam kwestionować ich 
użyteczności w tych zastosowaniach. Niemniej jednak uważam, że 
zastosowanie wyjątków jest lepsze, jeśli tylko w danym przypadku jest 
możliwe.

> Ale co w sytuacji, gdy 
> wszystkie błędy wywoływania zapytań bazy danych zwracają wyjątek 
> SqlException?

Zmienić bibliotekę? :-) Akurat do zapewniania obiektom trwałości w Javie 
jest spory wybór, jeśli chodzi o biblioteki.
Można też kusić się o pisanie własnych klas opakowujących wywołania kodu 
bibliotek, wprowadzanie foreign methods, istnieje wiele różnych technik.

--
Pozdrawiam,
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14425
Author: Aleksander Galicki
Date: Mon, 03 Apr 2006 23:32
13 lines
1580 bytes
>Warto użyć wyjątków wtedy, kiedy obsługa sytuacji będzie zwykle
>daleko od miejsca jej wykrycia, czyli kiedy bezpośrednim skutkiem tej
>sytuacji będzie przerwanie części obliczeń, oraz (w części języków,
>m.in. w C++ i Javie, w których rzucanie wyjątków jest względnie
>drogie)

Z ciekawosci: co tam jest takiego drogiego?

A.
-- 
============= P o l N E W S ==============
     archiwum i przeszukiwanie newsów
        http://www.polnews.pl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14426
Author: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 00:20
42 lines
3617 bytes
"Aleksander Galicki" <no@no.com> writes:

>>Warto użyć wyjątków wtedy, kiedy obsługa sytuacji będzie zwykle
>>daleko od miejsca jej wykrycia, czyli kiedy bezpośrednim skutkiem tej
>>sytuacji będzie przerwanie części obliczeń, oraz (w części języków,
>>m.in. w C++ i Javie, w których rzucanie wyjątków jest względnie
>>drogie)
>
> Z ciekawosci: co tam jest takiego drogiego?

W C++ akcje do wykonania przy okazji wyjątku są bardzo powszechne
(nietrywialne destruktory zmiennych lokalnych), więc implementacje C++
starają się tak realizować wyjątki, żeby wejście do takiego niejawnego
'try' ani wyjście z niego nic nie kosztowało.

Jeśli ma nie być dodatkowych narzutów związanych z 'try', to przy
typowej konwencji wołania funkcji jedynym sposobem na stwierdzenie,
co robić w przypadku wyjątku, jest obejrzenie każdej ramki stosu
między 'throw' a 'try' i znalezienie tych informacji na podstawie
adresu powrotu w "mapach kodu" (które mogą być zaalokowane
statycznie). Przy czym oglądać trzeba również te ramki stosu,
w których nie ma żadnych 'try', nawet niejawnych, bo a priori nie
wiadomo, które ramki takie są, a adresy powrotu trzeba wyszukiwać
w jakichś statycznych słownikach.

W implementacjach innych języków bywa tak, że wejście do 'try'
i wyjście z 'try' powoduje wykonanie dodatkowych instrukcji.
Na przykład w OCamlu przy wejściu do 'try' bieżący wierzchołek stosu
jest zapamiętywany w odpowiednim "rejestrze", a adres kodu obsługi
wyjątku i poprzednia wartość tego "rejestru" - na stosie. Za to
'throw' jest szybkie: zwijamy stos do najbliższego 'try' jednym
ruchem, czyli koszt jest proporcjonalny do liczby 'try', z których
trzeba wyskoczyć, a nie do liczby ramek stosu między 'throw' a 'try'.

W Javie nie ma tylu niejawnych 'try' co w C++, więc można tam
realizować wyjątki podobnie jak np. w OCamlu. Ale wydaje mi się,
że tradycyjnie wyjątki są obsługiwane podobnie jak w C++.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14427
Author: Immona
Date: Tue, 04 Apr 2006 08:19
33 lines
2582 bytes
>"Aleksander Galicki" <no@no.com> writes:
>
>>>Warto użyć wyjątków wtedy, kiedy obsługa sytuacji będzie zwykle
>>>daleko od miejsca jej wykrycia, czyli kiedy bezpośrednim skutkiem tej
>>>sytuacji będzie przerwanie części obliczeń, oraz (w części języków,
>>>m.in. w C++ i Javie, w których rzucanie wyjątków jest względnie
>>>drogie)
>>
>> Z ciekawosci: co tam jest takiego drogiego?
>
>W C++ akcje do wykonania przy okazji wyjątku są bardzo powszechne
>(nietrywialne destruktory zmiennych lokalnych), więc implementacje C++
>starają się tak realizować wyjątki, żeby wejście do takiego niejawnego
>'try' ani wyjście z niego nic nie kosztowało.
>
>Jeśli ma nie być dodatkowych narzutów związanych z 'try', to przy
>typowej konwencji wołania funkcji jedynym sposobem na stwierdzenie,
>co robić w przypadku wyjątku, jest obejrzenie każdej ramki stosu
>między 'throw' a 'try' i znalezienie tych informacji na podstawie
>adresu powrotu w "mapach kodu" (które mogą być zaalokowane
>statycznie). Przy czym oglądać trzeba również te ramki stosu,
>w których nie ma żadnych 'try', nawet niejawnych, bo a priori nie
>wiadomo, które ramki takie są, a adresy powrotu trzeba wyszukiwać
>w jakichś statycznych słownikach.
>

Ale Javy to nie dotyczy chyba ..?

A.
-- 
============= P o l N E W S ==============
     archiwum i przeszukiwanie newsów
        http://www.polnews.pl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14428
Author: Aleksander Galicki
Date: Tue, 04 Apr 2006 09:40
26 lines
1979 bytes
>>
>>Jeśli ma nie być dodatkowych narzutów związanych z 'try', to przy
>>typowej konwencji wołania funkcji jedynym sposobem na stwierdzenie,
>>co robić w przypadku wyjątku, jest obejrzenie każdej ramki stosu
>>między 'throw' a 'try' i znalezienie tych informacji na podstawie
>>adresu powrotu w "mapach kodu" (które mogą być zaalokowane
>>statycznie). Przy czym oglądać trzeba również te ramki stosu,
>>w których nie ma żadnych 'try', nawet niejawnych, bo a priori nie
>>wiadomo, które ramki takie są, a adresy powrotu trzeba wyszukiwać
>>w jakichś statycznych słownikach.
>>
>
>Ale Javy to nie dotyczy chyba ..?
>


le, ze tak powiem, obciach. Przepraszam, nie wylogowalem sie z konta mojej TŻ :-)



A.
-- 
============= P o l N E W S ==============
     archiwum i przeszukiwanie newsów
        http://www.polnews.pl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14429
Author: mgl
Date: Tue, 04 Apr 2006 10:55
38 lines
2939 bytes
Aleksander Galicki wrote:
> le, ze tak powiem, obciach. Przepraszam, nie wylogowalem sie z konta mojej TŻ :-)

Aż dłuższą chwilę zastanowienia miałem... przy całym szacunku do 
ciekawych doświadczeń i ogólnego życiowego rozsądku Immony nie 
podejrzewałem jej aż o taką wszechstronność :).

A sam wątek, nota bene, jest dość jałowy.

Java ma już swoje lata (zresztą z doświadczeń Java skorzystał też C# i 
.NET(*)), pewne best practices zdążyły się już wykrystalizować:

http://www-128.ibm.com/developerworks/java/library/j-ejbexcept.html
http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=1

i nie ma co odkrywać koła na nowo. Bardzo rozbawił mnie kiedyś ten artykuł:
http://jdn.pl/node/387
którego tezy są wprawdzie dość niesprawiedliwie wycelowane w Polaków, 
ale w ogólności coś w tym jest, że serwisowi thedailywtf.com nie brakuje 
treści do publikowania ;).

Jeśli ktoś ma wątpliwości jak obsługiwać błędy w warstwie DAO, a ten 
temat przewija się przez wątek, to warto zobaczyć, jak to zostało 
zrobione np. w Hibernate, TopLink czy Spring. A swoją drogą to poza 
wybitnie kuriozalnymi przypadkami przepychania checked exceptions z 
warstwy obsługi danych do samego widoku przez różne dziwne rzeczy po 
drodze, nie spotkałem się nigdy z sytuacją, żeby pomysł na obsługę 
wyjątków był aż tak zły, żeby powodowało to jakiś widoczny narzut kodu 
czy animozje projektowe.

(*) .NET zrezygnował z checked exceptions, co z jednej strony może mieć 
pewne zalety, z drugiej zaś biedni .netowi programiści nadal nie wiedzą, 
co może wylecieć z nieznanej im metody, o ile autor nie zadbał o 
precyzyjną dokumentację.

pozdrawiam,
-- 
mgl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14481
Author: Piotr Kobzda
Date: Tue, 04 Apr 2006 11:24
22 lines
2139 bytes
Aleksander Galicki wrote:

>>Warto użyć wyjątków wtedy, kiedy obsługa sytuacji będzie zwykle
>>daleko od miejsca jej wykrycia, czyli kiedy bezpośrednim skutkiem tej
>>sytuacji będzie przerwanie części obliczeń, oraz (w części języków,
>>m.in. w C++ i Javie, w których rzucanie wyjątków jest względnie
>>drogie)
> 
> Z ciekawosci: co tam jest takiego drogiego?

W Javie właściwie jedyny pewny koszt dodatkowy, to utworzenie instancji 
wyjątku, który jest rzucany. Nie da się tego kosztu pominąć w jakiś 
sensowny sposób, za każdym razem tworzony jest nowy wyjątek, który poza 
dodatkowymi atrybutami, przechowuje stos wywołań (bywa często, że 
niemały). Stąd i koszt w porównaniu z nie rzucaniem wyjątku jest tu w 
oczywisty sposób większy.

Cała reszta to już sprawy zalezne od implementacji maszyny wirtualnej, 
więc i w kontekście porównania kosztów jest bez znaczenia.


piotr
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14433
Author: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 12:15
106 lines
5229 bytes
"Immona" <c.oleszkiewicz@na.gmailu> writes:

>>Jeśli ma nie być dodatkowych narzutów związanych z 'try', to przy
>>typowej konwencji wołania funkcji jedynym sposobem na stwierdzenie,
>>co robić w przypadku wyjątku, jest obejrzenie każdej ramki stosu
>>między 'throw' a 'try' i znalezienie tych informacji na podstawie
>>adresu powrotu w "mapach kodu" (które mogą być zaalokowane
>>statycznie). Przy czym oglądać trzeba również te ramki stosu,
>>w których nie ma żadnych 'try', nawet niejawnych, bo a priori nie
>>wiadomo, które ramki takie są, a adresy powrotu trzeba wyszukiwać
>>w jakichś statycznych słownikach.
>
> Ale Javy to nie dotyczy chyba ..?

Hmm, właściwie to nie wiem, dlaczego wyjątki w C++ są wolne. Moje
rozumowanie było błędne: te ramki stosu i tak trzeba było kiedyś
utworzyć, więc asymptotyczny koszt rzucania wyjątku nie ma wpływu na
asymptotyczny koszt programu. Jednak eksperyment pokazuje, że rzucanie
wyjątku w GCC rzeczywiście jest wolne:

           | OCaml | C++ (GCC) | Java (Sun) |
-----------+-------+-----------+------------+
 pusty     | 0.003 |   0.004   |   0.246    |
 wynikiem  | 0.408 |   0.140   |   0.328    |
 wyjątkiem | 0.614 |  70.310   |   1.696    |

Programy niżej. Czasy w sekundach. Pusty program ma pętlę długości 0;
w ten sposób można wyeliminować czas uruchomienia programu. "Wynikiem"
przekazuje wynik w typie bool, "wyjątkiem" przekazuje wynik wyjątkiem.
Wygląda na to, że wyjątki w Javie Suna są dużo szybsze niż w GCC,
ale wolniejsze niż w OCamlu. Z czasów można wywnioskować, że żaden
kompilator nie wyoptymalizował całej pętli, więc mimo że to
microbenchmark, wynik wydaje się mierzyć prawdziwy koszt wyjątków.

----------------------------------------------------------------------
exception Exn

let test1 x y = x < y

let test2 x y = if x < y then raise Exn

let _ =
  let count = ref 0 in
  for i = 0 to 9999999 do
    (* if test1 i 5000000 then count := !count + 1 *)
    try test2 i 5000000 with Exn -> count := !count + 1
  done;
  print_int !count; print_newline()
......................................................................
ocamlopt exc-ml.ml -o exc-ml
time ./exc-ml
(ocaml-3.09.0)
----------------------------------------------------------------------
#include <iostream>

bool test1(int x, int y) {
   return x < y;
}

void test2(int x, int y) {
   if (x < y) throw 0;
}

int main() {
   int count = 0;
   for (int i = 0; i < 10000000; ++i) {
      // if (test1(i, 5000000)) ++count;
      try {test2(i, 5000000);} catch (int x) {++count;}
   }
   std::cout << count << std::endl;
}
......................................................................
g++ -O2 exc-cc.cc -o exc-cc
time ./exc-cc
(gcc-4.1.0)
----------------------------------------------------------------------
class ExcJava {
   static RuntimeException exn = new RuntimeException();

   static boolean test1(int x, int y) {
      return x < y;
   }

   static void test2(int x, int y) {
      if (x < y) throw exn;
   }

   public static void main(String[] args) {
      int count = 0;
      for (int i = 0; i < 10000000; ++i) {
         // if (test1(i, 5000000)) ++count;
         try {test2(i, 5000000);} catch (RuntimeException x) {++count;}
      }
      System.out.println(count);
   }
}
......................................................................
javac ExcJava.java
time java ExcJava
(java-sun-1.5.0.01)
----------------------------------------------------------------------

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14474
Author: Michal Przybylek
Date: Tue, 04 Apr 2006 13:07
10 lines
1466 bytes
"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> wrote:

> Hmm, właściwie to nie wiem, dlaczego wyjątki w C++ są wolne.

> g++ -O2 exc-cc.cc -o exc-cc

A jak wyglada assembler ?


mp
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14430
Author: Adam Przybyłek
Date: Tue, 04 Apr 2006 13:19
29 lines
1998 bytes
Użytkownik "mgl" <ask@for.email.com> napisał w wiadomości
news:e0tj9e$92e$1@news.dialog.net.pl...
> Aleksander Galicki wrote:
>[...] Java ma już swoje lata (zresztą z doświadczeń Java skorzystał też C#
i
> .NET(*)), pewne best practices zdążyły się już wykrystalizować:
>
> http://www-128.ibm.com/developerworks/java/library/j-ejbexcept.html
> [...]

Bardzo dobry przyklad - Listing 1, wiersze 111-114:

while (itemIter.hasNext()) {
  OrderItem item = (OrderItem) itemIter.getNext();
  item.remove();
}

Rozumiem, ze kolega Przemek napisal by ten fragment tak:

while (true) {
  OrderItem item = (OrderItem) itemIter.getNext();
  item.remove();
}
...
catch (NoSuchElementException nse) {}


Adam
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14475
Author: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 13:36
15 lines
1986 bytes
"Michal Przybylek" <mrp@neostrada.pl> writes:

>> g++ -O2 exc-cc.cc -o exc-cc
>
> A jak wyglada assembler ?

http://qrnik.knm.org.pl/~qrczak/tmp/exc-cc.s

Dla porównania asembler wygenerowany przez OCamla:
http://qrnik.knm.org.pl/~qrczak/tmp/exc-ml.s

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14477
Author: Adam Karpierz
Date: Tue, 04 Apr 2006 14:27
12 lines
1723 bytes
"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> wrote in message:

> Hmm, właściwie to nie wiem, dlaczego wyjątki w C++ są wolne. Moje
> rozumowanie było błędne: te ramki stosu i tak trzeba było kiedyś
> utworzyć, więc asymptotyczny koszt rzucania wyjątku nie ma wpływu na
> asymptotyczny koszt programu. Jednak eksperyment pokazuje, że rzucanie
> wyjątku w GCC rzeczywiście jest wolne:

Bo GCC od zawsze byl w tej materii spie..

AK 
Re: Wyrzucenie wyj±tku, czy zwrócenie null?
#14434
Author: AL.
Date: Tue, 04 Apr 2006 14:40
14 lines
1609 bytes
On Tue, 04 Apr 2006 14:15:13 +0200, Marcin 'Qrczak' Kowalczyk
<qrczak@knm.org.pl> wrote:
 
>
>Hmm, w³a¶ciwie to nie wiem, dlaczego wyj±tki w C++ s± wolne. Moje
>rozumowanie by³o b³êdne: te ramki stosu i tak trzeba by³o kiedy¶
>utworzyæ, wiêc asymptotyczny koszt rzucania wyj±tku nie ma wp³ywu na
>asymptotyczny koszt programu. Jednak eksperyment pokazuje, ¿e rzucanie
>wyj±tku w GCC rzeczywi¶cie jest wolne:
    

A pod prawdziwym kompilatorem?...

A.L.
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14478
Author: Piotr Kobzda
Date: Tue, 04 Apr 2006 14:46
20 lines
2184 bytes
Marcin 'Qrczak' Kowalczyk wrote:

> (...) Z czasów można wywnioskować, że żaden
> kompilator nie wyoptymalizował całej pętli, więc mimo że to
> microbenchmark, wynik wydaje się mierzyć prawdziwy koszt wyjątków.

Nie wiem jak w pozostałych przypadkach, odnośnie Javy myślę jednak, że 
to wniosek tak samo prawdopodobny, jak błędny. JIT sporo się tu 
napracował -- blisko 90% czasu spędzają wszystkie Twoje warianty w 
natywnym main (widać to ładnie z opcją -Xprof).

Poza tym, nie rozumiem dlaczego pomijasz optymalizacje?
Przecież to co robi z tym optymalizator jest za darmo, więc dlaczego nie 
uznajesz tego za rzeczywisty koszt? Jest to o tyle ważne, że akurat w 
przypadku Javy warianty "wynikiem" i "wyjątkiem" z opcją -server śmigają 
identycznie -- co dowodzi, że tworzenie wyjątków jest w Javie jedynym 
dodatkowym kosztem...


piotr
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14479
Author: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 15:24
23 lines
2659 bytes
Piotr Kobzda <pikob@gazeta.pl> writes:

> Poza tym, nie rozumiem dlaczego pomijasz optymalizacje?

Zależy jakie. Gdyby kompilator obliczył cały wynik w czasie kompilacji,
to taka optymalizacja przechodzi tylko w sztucznym mikrobenchmarku,
a w rzeczywistym kodzie z reguły nie ma szans. Ale jeśli polega tylko
na wyeliminowaniu rzucenia wyjątku, to być może przy innych użyciach,
kiedy rzucenie wyjątku jest bliskie złapania, też by tak było, i wtedy
warto na nią pozwolić. Wniosek: przydałby się bardziej realistyczny test.

> Jest to o tyle ważne, że akurat w przypadku Javy warianty "wynikiem"
> i "wyjątkiem" z opcją -server śmigają identycznie -- co dowodzi, że
> tworzenie wyjątków jest w Javie jedynym dodatkowym kosztem...

Hmm. Z -server pusty program wykonuje się tak samo długo jak wersja
bez wyjątku (0.35), a wersja z wyjątkiem trochę dłużej (0.38-0.43).
Nie umiem tego zinterpretować.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyj±tku, czy zwrócenie null?
#14435
Author: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 15:25
11 lines
1923 bytes
AL. <alewando@ziuta66.com> writes:

> A pod prawdziwym kompilatorem?...

Jeśli masz na myśli VC++, to nie mam jak sprawdzić, bo on nie działa
pod prawdziwym systemem operacyjnym.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: Wyrzucenie wyj±tku, czy zwrócenie null?
#14436
Author: AL.
Date: Tue, 04 Apr 2006 16:07
17 lines
1581 bytes
On Tue, 04 Apr 2006 17:25:37 +0200, Marcin 'Qrczak' Kowalczyk
<qrczak@knm.org.pl> wrote:

>AL. <alewando@ziuta66.com> writes:
>
>> A pod prawdziwym kompilatorem?...
>
>Je¶li masz na my¶li VC++, to nie mam jak sprawdziæ, bo on nie dzia³a
>pod prawdziwym systemem operacyjnym.

A nie masz jakichs prawdziwych systemow?... Linuksa do takowych nei
zaliczam.

A.L>

P.S> Mozna prosic o definicje "prawdziwego systemu operacyjnego? W
sensie MIMUW?...
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14480
Author: Piotr Kobzda
Date: Tue, 04 Apr 2006 16:16
161 lines
5777 bytes
Marcin 'Qrczak' Kowalczyk wrote:

>>Jest to o tyle ważne, że akurat w przypadku Javy warianty "wynikiem"
>>i "wyjątkiem" z opcją -server śmigają identycznie -- co dowodzi, że
>>tworzenie wyjątków jest w Javie jedynym dodatkowym kosztem...
> 
> Hmm. Z -server pusty program wykonuje się tak samo długo jak wersja
> bez wyjątku (0.35), a wersja z wyjątkiem trochę dłużej (0.38-0.43).
> Nie umiem tego zinterpretować.

To może zobacz moje rezultaty (kod poniżej):

C:\Eclipse\Workspaces\testy\benchmarks\bin>c:\java\jdk1.5.0_06\bin\java 
-Xprof -server ExcJava 50000000
..............................
ExcJava$1 t/count=0.768317764 t/10=1.92079441E7
ExcJava$2 t/count=1.809410972 t/10=4.52352743E7
ExcJava$3 t/count=1.798130212 t/10=4.49532553E7
..............................
ExcJava$1 t/count=0.696917624 t/10=1.74229406E7
ExcJava$2 t/count=1.794431416 t/10=4.48607854E7
ExcJava$3 t/count=1.786413636 t/10=4.46603409E7

Flat profile of 21.66 secs (810 total ticks): main

   Interpreted + native   Method
   0.9%     0  +     7    java.lang.System.arraycopy
   0.1%     1  +     0    ExcJava$1.run
   0.1%     1  +     0    ExcJava.<clinit>
   0.1%     0  +     1    java.io.FileOutputStream.writeBytes
   1.2%     2  +     8    Total interpreted

      Compiled + native   Method
  41.7%   338  +     0    ExcJava$3.run
  40.4%   327  +     0    ExcJava$2.run
  16.4%   133  +     0    ExcJava$1.run
  98.5%   798  +     0    Total compiled

   Thread-local ticks:
   0.2%     2             Class loader


Flat profile of 0.01 secs (1 total ticks): DestroyJavaVM

   Thread-local ticks:
100.0%     1             Blocked (of total)


Global summary of 21.68 seconds:
100.0%   812             Received ticks
   0.1%     1             Compilation
   0.2%     2             Class loader



piotr

-- 

public class ExcJava {

    private static final RuntimeException exn = new RuntimeException();

    static boolean test1(int x, int y) {
       return x < y;
    }

    static void test2(int x, int y) {
       if (x < y)
          throw exn;
    }

    public static void main(String[] args) {

       final int retrys = 2;
       final int loops = 10;

       final int m = args.length > 0
             ? Integer.parseInt(args[0]) : 10000000;
       final int n = args.length > 1
             ? Integer.parseInt(args[1]) : m / 2;


       abstract class Test {

          volatile int count;
          long t;

          abstract void run();

          void perform() {
             long t = System.nanoTime();
             run();
             this.t = System.nanoTime() - t;
          }

          void reset() {
             count = 0;
             t = 0;
          }

          @Override
          public String toString() {
             return getClass().getName()
                   + (count % n != 0
                         ? " count=" + count : "")
                   + " t=" + t;
          }
       }

       Test[] tests = new Test[] {
             new Test() {
                void run() {
                   for (int i = 0; i < n; ++i) {
                      ++count;
                   }
                };
             },
             new Test() {
                void run() {
                   for (int i = 0; i < m; ++i) {
                      if (test1(i, n))
                         ++count;
                   }
                };
             },
             new Test() {
                void run() {
                   for (int i = 0; i < m; ++i) {
                      try {
                         test2(i, n);
                      } catch (RuntimeException x) {
                         ++count;
                      }
                   }
                };
             },
          };


       for(int i = 0; i < retrys; ++i) {

          for(int j = 0; j < loops; ++j) {
             for(Test t : tests) {
                t.perform();
                System.out.print(".");
                if (t.count % n != 0)
                   System.out.println(t);
             }
          }
          System.out.println();

          for(Test t : tests) {
             System.out.println(t.getClass().getName()
                   + " t/count=" + (double)t.t / t.count
                   + " t/" + loops + "=" + (double)t.t / loops);
             t.reset();
          }
       }
    }
}
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14437
Author: Miros/law L. Baran
Date: Tue, 04 Apr 2006 16:40
21 lines
2020 bytes
PT AL pisze:

> P.S. Mozna prosic o definicje "prawdziwego systemu operacyjnego? W
> sensie MIMUW?...

...a skoro już tak off-topic, to ja chciałbym poznać definicję
"prawdziwego systemu operacyjnego" sensu A.L. (naprawdę mnie to
ciekawi; podobnie jak kryteria uznania czegoś za prawdziwy bądź
nieprawdziwy kompilator).

Jubal

-- 
[ Miros/law L Baran, baran-at-knm-org-pl, neg IQ, cert AI ] [ 0101010 is ]
[ BOF2510053411, http://hell.pl/baran/tek/, alchemy pany! ] [ The Answer ] 

    Alliance, n.:
            In international politics, the union of two thieves who
            have their hands so deeply inserted in each other's pocket
            that they cannot separately plunder a third.
                    -- Ambrose Bierce, ,,The Devil's Dictionary''
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14476
Author: Michal Przybylek
Date: Tue, 04 Apr 2006 17:32
15 lines
1713 bytes
"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> wrote:

> > A jak wyglada assembler ?
>
> http://qrnik.knm.org.pl/~qrczak/tmp/exc-cc.s

Dzieki. Choc niewiele pomoglo :-)

> Dla porównania asembler wygenerowany przez OCamla:
> http://qrnik.knm.org.pl/~qrczak/tmp/exc-ml.s

W OCaml'u mniej wiecej wiem jak sa obslugiwane wyjatki.


mp
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14472
Author: Adam Karpierz
Date: Tue, 04 Apr 2006 18:09
27 lines
2435 bytes
"Miros/law L. Baran" <baran@hell.pl> wrote:

> ...a skoro już tak off-topic, to ja chciałbym poznać definicję
> "prawdziwego systemu operacyjnego" sensu A.L.

Moge sie pokusic o taka definicje z punktu widzenia developera (bo na tym 
sie znam).
Prawdziwy system operacyjny to taki ktory dostarcza 
standardowo/defaultowo/itp
wbudowana w system dojrzala technologie komponentowa.
W dodatku technologia ta powinna byc wielojezykowa (w sensie jezykow 
programowania
oczywiscie).

Takim systemem jest np. wlasnie Windows (bo posiada COM/DCOM i .NET).

> (naprawdę mnie to ciekawi; podobnie jak kryteria uznania czegoś za
>  prawdziwy bądź nieprawdziwy kompilator).

Prawdziwy kompilator to taki ktory przynajmniej:
1. jest zgodny ze standardem/raportem jezyka (gcc nie jest).
2. jest bezbledny w podstawowych konstrukcjach j.progr (gcc nie jest).
3. jest efektywny w podstawowych konstrukcjach j.progr (gcc nie jest).
3. dobrze wspiera nowoczesne technologie komponentowe (gcc nie wspiera 
zadnej).

AK
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14473
Author: Piotr Dembiński
Date: Tue, 04 Apr 2006 19:43
13 lines
1810 bytes
"Miros/law L. Baran" <baran@hell.pl> writes:

> PT AL pisze:
>
>> P.S. Mozna prosic o definicje "prawdziwego systemu operacyjnego? 
>> W sensie MIMUW?...
>
> ...a skoro już tak off-topic, to ja chciałbym poznać definicję
> "prawdziwego systemu operacyjnego" sensu A.L. (naprawdę mnie to
> ciekawi; podobnie jak kryteria uznania czegoś za prawdziwy bądź
> nieprawdziwy kompilator).

Prawdziwe kryteria?
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14431
Author: Przemek Pokrywka
Date: Tue, 04 Apr 2006 20:35
39 lines
2652 bytes
Adam Przybyłek napisał(a):
> Bardzo dobry przyklad - Listing 1, wiersze 111-114:
> 
> while (itemIter.hasNext()) {
>   OrderItem item = (OrderItem) itemIter.getNext();
>   item.remove();
> }
> 
> Rozumiem, ze kolega Przemek napisal by ten fragment tak:
> 
> while (true) {
>   OrderItem item = (OrderItem) itemIter.getNext();
>   item.remove();
> }
> ...
> catch (NoSuchElementException nse) {}

:-)

"Kiedy mędrzec wskazuje na Księżyc, niektórzy widzą tylko palec" 
(zaadoptowane z dalekowschodniego powiedzenia)

Pisałem wcześniej, że użycie try/catch jest częstokroć pożądane, bo 
pozwala na znacznie wyraźniejsze zaznaczenie intencji kodu - jego 
scenariusza podstawowego oraz scenariuszy awaryjnych.
Osobiście nie użyłbym try/catch gdyby miało to zaciemnić przeznaczenie 
kodu. Przeróbka autorstwa Kolegi to robi, bo mylnie sugeruje, że 
pozytywnym scenariuszem wykonania jest nieprzerwane pobieranie i 
usuwanie elementu z iteratora. Prawdziwą intencją jest usunięcie 
wszystkich (a więc jedynie tych istniejących) elementów z iteratora, co 
jest bardzo wyraźnie komunikowane przez oryginalny fragment kodu.

Tak więc mimo że przeróbka jest funkcjonalnie równoważna, to kod jest 
zaciemniony, dlatego nie wprowadziłbym jej (nawet mimo braku 
wykorzystania konstrukcji try/catch).

--
Pozdrawiam,
Przemysław Pokrywka
Re: Wyrzucenie wyjątku, czy zwrócenie
#14432
Author: Aleksander Galicki
Date: Wed, 05 Apr 2006 11:40
17 lines
1684 bytes
>Aleksander Galicki wrote:
>> le, ze tak powiem, obciach. Przepraszam, nie wylogowalem sie z konta mojej
>TŻ :-)
>
>Aż dłuższą chwilę zastanowienia miałem... przy całym szacunku do 
>ciekawych doświadczeń i ogólnego życiowego rozsądku Immony nie 
>podejrzewałem jej aż o taką wszechstronność :).
>

Ja sie tez zdziwilem :) Zreszta, wyjartkami w Javie zadna normalna osoba spoza
branzy sie zainteresowac chyba nie da. 

A.
-- 
============= P o l N E W S ==============
     archiwum i przeszukiwanie newsów
        http://www.polnews.pl
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14483
Author: Grzesiek G.
Date: Wed, 05 Apr 2006 14:22
74 lines
4534 bytes
Przemek Pokrywka napisał(a):
> Grzesiek G. napisał(a):
> 
>> Ale zadanie wykonywane przez program to jest coś, co jest opisane w 
>> jakimś dokumencie. Więc jeżeli nikt nie napisał, że sprawdzanie 
>> istnienia pliku jest częścią zadania, to (według przedstawionej przeze 
>> mnie teorii) jest sytuacją wyjątkową i można ją śmiało obsłużyć przez 
>> catch.
>>
>> Co do tezy, że klient nie interesuje się tym co robi w środku metoda 
>> się zgadzam. Jednak klienta interesuje jak robi. Więc jeśli robi zbyt 
>> wolno, bo przebieg programu jest sterowany wyjątkami, to klient może 
>> się zainteresować.
> 
> 
> Przedstawiona teoria jest dla mnie bardzo naciągana, z tego powodu, że 
> klient, jeśli mu zależy na wydajności, to napisze o tym wprost, i to w 
> odniesieniu do konkretnych przypadków użycia, a nie w postaci stwierdzeń 
> na temat obsługi wyjątków w ciałach poszczególnych metod.
> Wyjątki mogą stanowić problem wydajnościowy w marginalnych wypadkach i 
> tylko raport narzędzia typu profiler może stanowić przesłankę do 
> zastąpienia ich czymś innym. Byłbym bardzo zainteresowany usłyszeniem o 
> przypadku, w którym u kogoś to faktycznie obsługa wyjątków pod względem 
> wydajności stanowiła wąskie gardło systemu, przez co system nie spełniał 
> wymagań wydajnościowych postawionych mu przez klienta.

Aż dziw mnie bierze (i przyznam że zazdroszczę) :-), że się nie 
spotkałeś ani razu :-). Miałem do wykonania program walidujący i 
importujący plik csv do bazy danych. Wyjściem z nieudanej walidacji był 
raport błędów. Program był zrobiony tak, że przetwarzał plik do 
struktury obiektowej, którą obrabiał i zapisywał w bazie. Plik był 
poprawny, jeśli dawał się przekształcić do struktury obiektowej.

Niestety, rzeczywiste pliki okazały się fatalne. Tworzyło je pare osób w 
  MS Office i różnych Open Officach, także walidacja stała się ważna. Co 
gorsza za długo trwała (kilka minut), co bardzo złościło klienta. Była 
napisana poczętkowo w stylu:
try
{
	zmienna = decimal.Parse(napis);
	...
}
catch(InvalidFormatException exc)
{
	logger.log("Nie można skonwertować ...);
}

została przepisana na:
if(decimal.TryParse(napis)
{
	zmienna = decimal.Parse(Napis);
}
else
{
	logger.log("Nie można skonwertować ...);
}
Czas wykonania walidacji skrócił się do kilkudziesięciu sekund.


> Jeszcze raz za mistrzem Knuthem powtórzę, że "premature optimization is 
> the root of all evil"
> 

Z tą tezą też się zgadzam. Ale jeżeli np. w naszej aplikacji WWW strony 
ładują się u klienta kilkadziesiąt sekund, to nie czekamy na 
uzupełnienie specyfikacji uwagami o wydajności, tylko bierzemy się do 
pracy. Często wystarczy wyłączyć emula u użytkowników sieci klienta, ale 
czasami trzeba poprawić nasz soft.

Pozdrawiam

-- 
Grzegorz Gruza
Odpowiadając usuń "spamerom_nie." z adresu!!!
Re: Wyrzucenie wyjątku, czy zwrócenie null?
#14484
Author: Przemek Pokrywka
Date: Wed, 05 Apr 2006 16:35
37 lines
2737 bytes
Grzesiek G. napisał(a):
> Miałem do wykonania program walidujący i 
> importujący plik csv do bazy danych. Wyjściem z nieudanej walidacji był 
> raport błędów. Program był zrobiony tak, że przetwarzał plik do 
> struktury obiektowej, którą obrabiał i zapisywał w bazie. Plik był 
> poprawny, jeśli dawał się przekształcić do struktury obiektowej.
> 
> Niestety, rzeczywiste pliki okazały się fatalne. Tworzyło je pare osób w 
>  MS Office i różnych Open Officach, także walidacja stała się ważna. Co 
> gorsza za długo trwała (kilka minut), co bardzo złościło klienta. Była 
> napisana poczętkowo w stylu:
> try
> {
>     zmienna = decimal.Parse(napis);
>     ...
> }
> catch(InvalidFormatException exc)
> {
>     logger.log("Nie można skonwertować ...);
> }
> 
> została przepisana na:
> if(decimal.TryParse(napis)
> {
>     zmienna = decimal.Parse(Napis);
> }
> else
> {
>     logger.log("Nie można skonwertować ...);
> }
> Czas wykonania walidacji skrócił się do kilkudziesięciu sekund.

No to rzeczywiście obsługa wyjątków stanowiła wąskie gardło...
Poznanie tego przypadku było dla mnie ciekawym doświadczeniem.

--
Przemysław Pokrywka
Page 1 of 2 • 66 total messages
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads