Re: Exception propagation
On Dec 10, 12:29 pm, Goran <goran.pu...@gmail.com> wrote:
In C++ code, there's no good reason to ever STOP exception propagation
AND replace it with return code, except e.g. in main. Or perhaps when
you are writing a module that should be exposed to a language that
can't receive C++ exceptions.
Further, there are RARE reasons to stop exception propagation. Off the
top of my head, some of those rare ones are:
* main() - you seldom want want terminate() to kick in, which is what
will happen if exception escapes main()
* for similar reason, any top-level thread function
* to re-throw existing exception, but with further info about the
error (e.g. "bad_alloc happened when fryding the swoorf"). This is
because lowest-level exceptions have no further info about the context
in which they happened, and that is useful, and C++ has no call stack
in exception objects ;-).
* there's a loop whose whole body can fail, but next iteration still
should happen, usually after reporting the error. Example: a server-
kind-of-a-program, who has a client serving loop, and serving one
client request failed.
Well that last one is hardly rare. Most programs today are
servers, I think.
I stop the propagation in the following for performance
reasons:
cmw_request
getRequest (uint8_t byteOrder
, sock_type sock)
{
static ReceiveBuffer<SameFormat> localbuf(4096);
#ifdef ENDIAN_BIG
static ReceiveBuffer<LeastSignificantFirst> otherlocalbuf(4096);
#else
static ReceiveBuffer<MostSignificantFirst> otherlocalbuf(4096);
#endif
uint8_t clientFormat;
Read(sock, &clientFormat, 1);
try {
if (clientFormat == byteOrder) {
localbuf.sock_ = sock;
while (!localbuf.GotPacket()) ;
return cmw_request(localbuf);
} else {
otherlocalbuf.sock_ = sock;
while (!otherlocalbuf.GotPacket()) ;
return cmw_request(otherlocalbuf);
}
} catch (::std::exception const& ex) {
clientFormat == byteOrder ? localbuf.Reset() :
otherlocalbuf.Reset();
throw;
}
}
The exception catching allows me to make some variables
static that would otherwise be allocating and releasing
memory from the heap each time the function is called.
It is kind of experimental, but so far so good.
The above function is from this file --
http://webEbenezer.net/misc/cmwAmbassador.cc.
Brian Wood
Ebenezer Enterprises
http://webEbenezer.net