On Sun, Jun 7, 2020 at 2:02 AM Joaquin M López Muñoz < joaquinlopezmunoz@gmail.com> wrote:
I still don't get it. What is the difference between:
int main() { return boost::leaf::try_handle_some( []()->boost::leaf::result<int>{ return 0; }, [](boost::leaf::match
){return 0;}, [](boost::leaf::catch_std::exception){return 1;}, [](const boost::leaf::error_info&){return 2;} ).value(); }
One of your handlers uses catch_<>. This means that your try block will execute inside a try scope, and your handlers will execute in a catch scope. If the try block throws, LEAF will catch the exception and attempt to find a handler. It doesn't have to be a handler that uses catch_<>, the first suitable handler will be called. If your try block returns a failure without throwing, LEAF will attempt to find a handler also. In this case, the handler that uses catch_<> will not be called, because no exception was thrown. If a suitable handler could not be found, the error is propagated by rethrowing the exception or returning the result<int> returned from the try block, as appropriate.
and
int main() { return boost::leaf::try_catch( []()->boost::leaf::result<int>{ return 0; }, [](boost::leaf::match
){return 0;}, [](boost::leaf::catch_std::exception){return 1;}, [](const boost::leaf::error_info&){return 2;} ).value(); }
With try_catch, your try block always executes in a try scope, and your handlers execute in a catch scope, even if none of them use catch_<>. If an exception is thrown, try_catch will try to find a suitable handler. It does not understand the semantics of the result type.