Article View: pl.comp.lang.c
Article #272376Re: Odśmiecania współbieżnego ciąg dalszy
From: Sektor van Skijlen
Date: Wed, 05 Mar 2008 12:26
Date: Wed, 05 Mar 2008 12:26
66 lines
4273 bytes
4273 bytes
Dnia Wed, 5 Mar 2008 02:42:37 -0800 (PST), Michał 'Khorne' Rzechonek skrobie:
> On 4 Mar, 20:02, Sektor van Skijlen
> <ethou...@guess.if.gmail.com.is.valid.or.invalid> wrote:
> > Przecież destruktor również może rzucić wyjątkiem. Żadnego jawnego zakazu w
> > C++ na ten temat nie ma. Istnieje tylko jedna reguła: destruktor, który miałby
> > rzucić wyjątkiem, musi najpierw sprawdzić czy std::uncaught_exception(). Jeśli
> > tego nie zrobi, program dostanie terminate()m.
> http://www.gotw.ca/gotw/047.htm
Oczywiście, on ma rację, ale ja mówię o zupełnie czym innym - o czym Herbuś
pewnie nie wie.
Chodzi o obiekty, dla których rzucanie wyjątku z destruktora jest istotą
działania. Na przykład:
{
Initializer i( &v );
i.add( x );
i.add( y );
} // destruktor skleja i wpisuje do v
Nie wiem, czy to coś ma jakąś konkretną nazwę - nazwijmy to "pending state
object".
Tego typu obiekty mają następujące charakterystyki:
1. Najczęściej są używane jako obiekty tymczasowe (np. proxy dla operatora
przecinek, co kiedyś tu pokazywałem - dokładnie to pokazał ktoś inny, a ja
tylko inspirowałem :).
2. Destruktor ma za zadanie tylko i wyłącznie rzucić wyjątkiem w razie
niemożności skompletowania operacji.
W takiej sytuacji destruktor powinien mieć następującą definicję:
1. Spróbować wykonać operację dopełniającą
2. Jeśli podczas tej operacji wystąpił błąd:
a. jeśli !uncaught_exception(), rzucić wyjątek
b. jeśli nie, to po prostu nie rób nic
Ponieważ ten obiekt ma ściśle ograniczony zasięg działania, więc rzucenie
zwijanie tego obiektu podczas zwijania stosu na rzecz wyjątku i tak przerwie
całą operację, która go używa. Nie ma zatem żadnych powodów, aby ta operacja
informowała o jakimkolwiek błędzie, bo nawet jeśli wystąpił, i tak to już nie
ma żadnego znaczenia.
Herbuś mówi tutaj o zupełnie innych rzeczach - o "normalnych" obiektach, które
próbują sprzątać po sobie, a to sprzątanie może zakończyć się wyjątkiem. TU MA
RACJĘ. W takich obiektach destruktor powinien złapać ewentualny wyjątek z
operacji nieudanego cleanupu i go "zdusić". Ja mówię o zupełnie innych
obiektach - obiektach, w których destruktor jest dopełnieniem częściowych
operacji.
Najważniejszą sprawą w tym jest fakt, że obiekt taki ma NIE ROBIĆ ZUPEŁNIE NIC
w przypadku, gdy uncaught_exception(). Najlepiej, żeby miał zawsze na
początku:
if ( uncaught_exception() ) return;
--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
Technical Details
Message-ID:
<fqm3hr$8vb$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mailReferences:
<fppvdq$68v$1@inews.gazeta.pl> <fq0od3$5bm$1@inews.gazeta.pl> <fq0qpa$ekv$1@inews.gazeta.pl> <fq0s58$jvv$1@inews.gazeta.pl> <fq0tjl$shn$1@news.vectranet.pl> <fq10ir$8nn$1@inews.gazeta.pl> <fq140s$2u6$1@news.vectranet.pl> <fq164t$3bl$1@inews.gazeta.pl> <fq1mqa$kqq$1@news.vectranet.pl> <fq42jk$k6t$1@bozon2.softax.pl> <fq69s2$33b$1@news.supermedia.pl> <fqjtbf$201$1@bozon2.softax.pl> <fqk6d0$lqs$2@kujawiak.man.lodz.pl> <2c077589-cb63-4e02-b860-d66f2030b914@n58g2000hsf.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.lang.c
Subject: Re:
Odśmiecania współbieżnego ciąg dalszy
Date: Wed, 5 Mar 2008 12:26:35 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 66
Sender: Michal Malecki <sektor@student.kis.p.lodz.pl>
Message-ID: <fqm3hr$8vb$1@kujawiak.man.lodz.pl>
References: <fppvdq$68v$1@inews.gazeta.pl> <fq0od3$5bm$1@inews.gazeta.pl> <fq0qpa$ekv$1@inews.gazeta.pl> <fq0s58$jvv$1@inews.gazeta.pl> <fq0tjl$shn$1@news.vectranet.pl> <fq10ir$8nn$1@inews.gazeta.pl> <fq140s$2u6$1@news.vectranet.pl> <fq164t$3bl$1@inews.gazeta.pl> <fq1mqa$kqq$1@news.vectranet.pl> <fq42jk$k6t$1@bozon2.softax.pl> <fq69s2$33b$1@news.supermedia.pl> <fqjtbf$201$1@bozon2.softax.pl> <fqk6d0$lqs$2@kujawiak.man.lodz.pl> <2c077589-cb63-4e02-b860-d66f2030b914@n58g2000hsf.googlegroups.com>
NNTP-Posting-Host: student.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1204719995 9195 212.191.89.21 (5 Mar 2008 12:26:35 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Wed, 5 Mar 2008 12:26:35 +0000 (UTC)
User-Agent: tin/1.8.3-20070201 ("Scotasay") (UNIX) (FreeBSD/6.2-RELEASE-p3 (sparc64))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit