Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2022-02-15 02:38:36


Gavin Lambert wrote:
> On 15/02/2022 14:53, Peter Dimov wrote:
> > I think I like Emil's user-provided handler better, because with it
> > the user would control whether and what is collected.
>
> I did consider mentioning that, but what I don't like about that option is that it
> leaves things a bit too vague.
>
> (And in terms of ThrowException itself, it's fundamentally equivalent to the
> NO_EXCEPTIONS path, by making it call a user-provided method to do the
> actual work. Which then seems to defeat the point of having it be a library at
> all.)
>
> It puts the burden entirely on the end-user to select the mechanism for error
> info propagation, and library authors would have a harder time interfacing
> with it.

I think there might be a misunderstanding here. What I envisage is this

void (*throw_handler)( std::exception const& ex, boost::exception& bx,
  boost::source_location const* loc ) = default_throw_handler;

void set_throw_handler( auto* p ) { throw_handler = p; }

void default_throw_handler( std::exception const& ex, boost::exception& bx,
  boost::source_location const* loc )
{
    if( loc ) bx.set_location( *loc );
}

template<class E> BOOST_NORETURN void throw_exception( E const & e )
{
    wrapexcept<E> wx( e );
    throw_handler( e, e, 0 );
    throw wx;
}

template<class E> BOOST_NORETURN void throw_exception( E const & e,
  boost::source_location const & loc )
{
    wrapexcept<E> wx( e );
    throw_handler( e, e, &loc );
    throw wx;
}

That is, boost::throw_exception still adds a boost::exception base, and that's
the mechanism for error info propagation; the user just gets to put things
into it before it's thrown - such as a stack trace.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk