🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #14426

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

#14426
From: 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/
Technical Details
Message-ID: <873bgukx87.fsf@qrnik.zagroda>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.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 <8764lqajbt.fsf@qrnik.zagroda> <06040401321180@polnews.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.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 02:20:24 +0200
Organization: Klub Nieszkodliwych Manjaków
Lines: 42
Message-ID: <873bgukx87.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 <8764lqajbt.fsf@qrnik.zagroda> <06040401321180@polnews.pl>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1144110132 7618 217.96.225.87 (4 Apr 2006 00:22:12 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Tue, 4 Apr 2006 00:22:12 +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:hxS3dqtUv4kwhAyKEEXM9m8j5cY=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit