🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #14500

Re: Wyrzucenie wyjątku, czy zwrócenie null?

#14500
From: Marcin 'Qrczak' Kowalczyk
Date: Mon, 03 Apr 2006 22:42
55 lines
4257 bytes
Przemek Pokrywka <adres@zastrzezony.com> writes:

> if ( ! stack.empty()) {
> 	Object result = stack.pop();
> }
> co jest konstrukcją ewidentnie błędną, bo kto zagwarantuje, że między
> wywołaniem empty() a pop() stan stosu nie ulegnie zmianie? (np.
> wskutek działania innego wątku)

Jeśli ten stos nie przewiduje używania w wielu wątkach naraz
(co w większości języków wymaga jawnej synchronizacji), to użycie go
w wielu wątkach bez synchronizacji i tak jest błędne, więc silenie się
na unikanie wyjątku jest bezcelowe.

> Jeśli z jakiś powodów uzyskanie tego elementu nie będzie możliwe,
> przechodzimy do realizacji "planu B". Trzeba jednak podkreślić, że
> naszą intencją jest pomyślne przeprowadzenie "planu A", a "plan B"
> jest tylko naszym ubezpieczeniem się na wypadek sytuacji awaryjnej.

To zależy od konkretnego problemu, może tak być albo może nie być.
Opis problemu był dość abstrakcyjny i tego nie rozstrzygał.

> Dlatego znacznie lepiej będzie zapisać plan podstawowy w bloku try,
> a plan awaryjny w bloku catch, gdzie jest jego naturalne miejsce
> i gdzie nikt nie podejrzewa, że jest on planem podstawowym.

Używanie tradycyjnego 'try' w tego typu sytuacjach ma taką wadę, że
łapane są również wyjątki w trakcie przetwarzania elementu usuniętego
ze stosu. Jeśli w trakcie tych obliczeń zostało wykonane jakieś pop()
na zupełnie innym stosie, który okazał się pusty, to prawdopodobnie
powrót do tego miejsca i wykonanie kodu przeznaczonego dla sytuacji
braku elementu na tym stosie jest błędem, zwykle polegającym na
zamaskowaniu innego błędu.

Winę ponosi składnia i semantyka 'try' w większości języków: brakuje
możliwości określenia kodu, który należy wykonać, kiedy nie było
wyjątku, ale już bez łapania tutaj wyjątków z tego kodu. Ten kod
powinien mieć dostęp do zmiennych zdefiniowanych w głównym ciele 'try'.

Można to zasymulować tradycyjnym 'try': w głównym ciele zmaterializować
w zmiennych lokalnych informację o niewystąpieniu wyjątku, w kodzie
łapiącym wyjątki zapisać przeciwną informację, a na zewnątrz 'try'
sprawdzić, czy ten 'try' skończył się obsłużeniem wyjątku czy nie.

To jest jednak mniej wygodne niż włożenie wszystkiego do 'try'.

Pewnie większość programistów nie zdaje sobie sprawy, że po cichu
przyjmuje założenie, że ten kod przesunięty do środka 'try' nie
skończy się łapanym tutaj wyjątkiem, i tworzy kod, który jest mniej
"robust" albo zgoła błędny.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <87r74el1ra.fsf@qrnik.zagroda>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <e09c3r$lg3$1@news.onet.pl> <e09f0h$cis$1@news.task.gda.pl> <e09gjn$737$1@news.onet.pl> <e0b1re$bdc$1@news.onet.pl> <e0c8eh$ur8$1@news.onet.pl> <e0cd04$ljh$1@news.task.gda.pl> <e0ced6$f7g$1@news.onet.pl> <e0dabl$1sv$1@news.task.gda.pl> <87y7ytka81.fsf@qrnik.zagroda> <e0e8n1$ppe$1@news.task.gda.pl> <e0rkiq$5ti$1@news.task.gda.pl> <e0s6iu$mms$1@news.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl>
Newsgroups: pl.comp.objects
Subject: Re: Wyrzucenie wyjątku, czy
 zwrócenie null?
Date: Tue, 04 Apr 2006 00:42:33 +0200
Organization: Klub Nieszkodliwych Manjaków
Lines: 55
Message-ID: <87r74el1ra.fsf@qrnik.zagroda>
References: <e09c3r$lg3$1@news.onet.pl> <e09f0h$cis$1@news.task.gda.pl> <e09gjn$737$1@news.onet.pl> <e0b1re$bdc$1@news.onet.pl> <e0c8eh$ur8$1@news.onet.pl> <e0cd04$ljh$1@news.task.gda.pl> <e0ced6$f7g$1@news.onet.pl> <e0dabl$1sv$1@news.task.gda.pl> <87y7ytka81.fsf@qrnik.zagroda> <e0e8n1$ppe$1@news.task.gda.pl> <e0rkiq$5ti$1@news.task.gda.pl> <e0s6iu$mms$1@news.onet.pl>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1144104175 18734 217.96.225.87 (3 Apr 2006 22:42:55 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Mon, 3 Apr 2006 22:42:55 +0000 (UTC)
X-Face: .B/ouEO}=VFkSJWE}s0@!:diHI.Z,<Ilt`:~@*]7rnn^K_y"XV8AXf^E)x*|3yVg:$FCq0Y )iGn@Z[SOA<+p}TkAv'Lzu$w{z2?F);0Xt>`m}AqK#Vjuscq(Vf1B}H[)v\9tBN}>AdP,QSRbhO]=v 3?;I+cN/Z0HKPm_Eg99/pFrU!WfpjgQ!z":>A~qt0^4):0-UuPB(6^>j!mN$)RIb)rRhXeK:+MLPW[ RVb7Kepvby-ww6_zci7Yy_@IrWW
User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.4 (gnu/linux)
Cancel-Lock: sha1:THv9ctd05ic0SRpi11ZpiRheBQg=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit