catch (std::exception&) {throw;} \
catch (System::Exception^ e) \
{ \
std::vector<boost::iterator_range<std::string::const_iterator> > tokens; \
std::string function(__FUNCTION__); \
boost::algorithm::split(tokens, function, boost::is_any_of(":"), boost::algorithm::token_compress_on); \
std::string what("["); \
if (tokens.size() > 1) \
{ \
boost::range::copy(*(tokens.rbegin()+1), std::back_inserter(what)); \
what += "::"; \
if (boost::range::equal(*(tokens.rbegin()+1), *tokens.rbegin())) \
what += "ctor"; \
else if (tokens.rbegin()->front() == '~') \
what += "dtor"; \
else \
boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \
} \
else if (tokens.size() > 0) \
boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \
what += "] "; \
throw std::runtime_error(what); \
}
forwards managed exception to unmanaged code; prepends function with a single level of scope, e.g.