On Wed, Jan 23, 2019 at 11:47 AM Sorin Fetche via Boost < boost@lists.boost.org> wrote:
On Wed, Jan 23, 2019, 2:07 AM Emil Dotchevski via Boost < boost@lists.boost.org wrote:
Thank you for testing.
I fixed the first assert, I hadn't tested catch_<> when there is no exception. It works now.
I'm trying to evaluate how the LEAF library would work for transporting additional information besides error codes when implementing Asio asynchronous operations.
So, my next test is to capture both errors and exceptions together with additional info and pass them to the completion handler that will do a detailed error analysis.
I have two unsuccessful attempts at this on wandbox (together with leaf/all.hpp merged in a single file by a little Python script):
- with try_: https://wandbox.org/permlink/t0r0IUntnga6zUUK
- with capture_result: https://wandbox.org/permlink/OCfmA9WXEgSySE1E
Any suggestions on how to change the test(s) to achieve this? Would this be a use case supported (efficiently, when no error occurred)
by
the LEAF library?
Yes, I should put this in FAQ in the documentation because it is subtle yet critical. This is correct: leaf::try_( [ ]() -> leaf::result<T> { return do_work(); //but usually the do_work body goes here, rather than a single function call. }, ..... //handlers ); This is incorrect: leaf::result<T> r = do_work(); leaf::try_( [r]() -> leaf::result<T> { return r; }, ..... //handlers ); The problem is that the memory where any errors reported to LEAF by do_work will be moved to is in the scope of leaf::try_, so anything that happens before you enter leaf::try_ won't be captured by *this* leaf::try_, but by some *other* leaf::try_, leaf::handle_some, or leaf::handle_all scope up the call chain, if any. You can _almost_ forget that leaf::result<T> doesn't contain any actual error objects... but not quite. :) If you haven't already, you can look at example/capture_eh.cpp and example/capture_result.cpp, they demonstrate the canonical way to transport error objects across threads. Let me know if I can help more.