🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #272376

Re: Odśmiecania współbieżnego ciąg dalszy

#272376
From: Sektor van Skijlen
Date: Wed, 05 Mar 2008 12:26
66 lines
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-mail
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>

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