Re: Exceptions in destructors
This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig37DCD511F8BA31AE4BFB3215
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Greg Herlihy wrote:
On 4/29/07 7:50 PM, in article f13lhq$f39$1@ensb.cpsc.ucalgary.ca, "Ren=
nie
deGraaf" <degraaf@cpsc.no-processed-pork.ucalgary.ca> wrote:
I know that if an exception is thrown from a destructor while unwindin=
g
the stack because of another exception, terminate() is called (FAQ
17.3). How exactly does this rule work? Is it acceptable to both thr=
ow
/and/ catch an exception inside a destructor, as in the following code=
?
struct Foo
{
void finalize()
{
throw 1.0;
}
~Foo()
{
try
{
finalize();
}
catch (double d)
{}
}
};
The runtime calls terminate() if - during exception processing - anothe=
r
thrown exception "escapes" from the destructor in which it was thrown.
So as long as the thrown exception in the code above is caught before F=
oo's
destructor exits, then terminate() will not be called. Therefore the ab=
ove
code is technically safe - but it is also fragile. Specifically, Foo's
destructor assumes that finalize() will only ever throw a double - but
through there is nothing in finalize()'s implementation that enforces s=
uch a
restriction - nor is there anything in Foo's destructor to check whethe=
r its
assumption about the type of finalize()'s thrown exceptions - remains v=
alid
since the last time it checked.
Greg
In other words, I really should add throw specifiers, like this:
struct Foo
{
void finalize() throw(double)
{
throw 1.0;
}
~Foo() throw()
{
try
{
finalize();
}
catch (double d)
{}
}
};
I suppose that it would generally be a good idea to /always/ tag my
destructors with throw() unless I have a good reason to do otherwise?
For that matter, are there any circumstances where it would be safe to
throw an exception from a destructor?
Rennie deGraaf
--------------enig37DCD511F8BA31AE4BFB3215
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
iD8DBQFGNX7tIvU5mZP08HERAu/9AJ0R26LkBLs6hVMjMAVsH181cMjTtgCfa7p2
jCaJy2cRDZA0JQgMQbdslt0=
=u7Mx
-----END PGP SIGNATURE-----
--------------enig37DCD511F8BA31AE4BFB3215--