=head1 NAME

XS::Framework::Manual::SVAPI::exceptions - XS::Framework exceptions reference


It is wrong way to invoke C<Perl_croak()> in XS-adatper C++ code, as this is
plain C functions, which knows nothing about C++ context and stack unwinding,
so it potentially leads to memory leaks.

When using L<XS::Framework>, it automatically wraps XS-adapter (and, hence C++)
code into C<try/catch> via C<throw_guard>, which will do proper housekeeping
and then C<croak()>.

L<XS::Framework> is shipped with default handlers for C<std::exception&>,
C<const std::string&>, C<const panda::string&>, C<char*>, C<SV*>, C<SV&>
etc as well as catch-all C<...> hanlder, which will do conversion into
Perl string and C<croak> with it.

No additional efforts are needed here, as this is out of the box behaviour.

However, if the underlying C++ library use custom/non-standard exceptions
or there is need to do tricky exception to Perl SV* conversion, it is possible
to use C<xs::add_catch_handler()> function:

    using CatchHandlerSimple = std::function<Sv()>;
    using CatchHandler       = std::function<Sv(const Sub&)>;   // context call function

    void add_catch_handler (CatchHandlerSimple f);
    void add_catch_handler (CatchHandler       f);

    // let's assume that CustomException::description() returns const std::string&
    xs::add_catch_handler([]() -> Sv {
        try { throw; }
        catch (CustomException& e) { return xs::out(e.description()); }
        return nullptr;

Please note, that the exception handlers are executed in FILO-order, i.e. the
most recently added exception handler will be executed first; the shipped
exception handlers are executed last.

=head1 SEE ALSO