|
Boost : |
From: Alex Besogonov (cyberax_at_[hidden])
Date: 2005-10-07 05:13:46
Hello, world!
Today I was browsing RSDN (Russian Software Developer Network) forums
and found a great trick for exception handling
(http://rsdn.ru/Forum/Message.aspx?mid=1420259&only=1):
==============
void TheFunction()
{
try {
...
} catch(...) {
ExceptionFilter();
}
}
void ExceptionFilter()
{
try {
throw;
} catch(Exception1 const& e) {
//Blah-blah 1
} catch(Exception2 const& e) {
//Blah-blah 2
} catch(Exception3 const& e) {
//Blah-blah 3
} catch(Exception4 const& e) {
//Blah-blah 4
} catch(Exception5 const& e) {
throw; //Just rethrow
} catch(...) {
//Something other
}
}
==============
It turns out that this trick is explicitly permitted by the Standard (as
it was pointed in this post:
http://rsdn.ru/Forum/Message.aspx?mid=1420469&only=1).
I think this trick can be really helpful in conjunction with Boost.Bind.
It would be great to write something like this:
====================
boost::function<void()> func=
boost::bind_with_filter(&SomeObj::func1,obj,logging_filter());
====================
If SomeObj::func1 throws an exception then logging_filter will write it
into the application's log and suppress its further propagation.
Or another use-case:
====================
boost::function<void()>
func=boost::bind_with_filter(&ComObject1::func,obj,com_error_translator());
====================
com_error_translator will translate exceptions from Microsoft's
_com_error to something like std::runtime_error.
-- With respect, Alex Besogonov(cyberax_at_[hidden])
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk