std::promis...et_exception(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸŽ€ NAME πŸŽ€

std::promise::set_exception β€” std::promise::set_exception. Yep, the name said it twice, she's thorough πŸ’…. This is the page for std::promise::set_exception from the C++ Standard Libary manual (yes, that's how the header spells it, she's doing her best), and the page badge is std::promis...et_exception(3) β€” abbreviated like an icon. ✨


🌸 Synopsis 🌸

Okay so here's the signature, and it's been iconic since C++11:

void set_exception( std::exception_ptr p );  (since C++11)

Atomically stores the exception pointer p into the shared state and makes the state ready. No cap.

The operation behaves as though set_value, set_exception, set_value_at_thread_exit, and set_exception_at_thread_exit acquire a single mutex associated with the promise object while updating the promise object. That's the whole synchronized bestie situation 🫢.

An exception is thrown if there is no shared state or the shared state already stores a value or exception.

Calls to this function do not introduce data races with calls to get_future (therefore they need not synchronize with each other). Lowkey important, highkey slay. πŸ”₯


πŸ¦‹ Parameters πŸ¦‹

  • p β€” exception pointer to store. The behavior is undefined if p is null. Like, undefined behavior undefined β€” do not play with that. 🫣

πŸ’– Return value πŸ’–

(none) β€” literally nothing comes back, bestie. It's giving "I did the thing, no receipt needed." πŸ’…


✨ Exceptions ✨

std::future_error on the following conditions:

  • *this has no shared state. The error code is set to no_state.
  • The shared state already stores a value or exception. The error code is set to promise_already_satisfied.

πŸ“ Example πŸ“

// Run this code β€” yes bestie, run it, it's right here:

        #include <future>
        #include <iostream>
        #include <thread>

        int main()
        {
            std::promise<int> p;
            std::future<int> f = p.get_future();

            std::thread t([&p]
            {
                try
                {
                    // code that may throw
                    throw std::runtime_error("Example");
                }
                catch (...)
                {
                    try
                    {
                        // store anything thrown in the promise
                        p.set_exception(std::current_exception());
                        // or throw a custom exception instead
                        //
       p.set_exception(std::make_exception_ptr(MyException("mine")));
                    }
                    catch (...) {} // set_exception() may throw too
                }
            });

            try
            {
                std::cout << f.get();
            }
            catch (const std::exception& e)
            {
                std::cout << "Exception from the thread: " << e.what() << '\n';
            }
            t.join();
        }

Output:

        Exception from the thread: Example

πŸ‘‘ See also πŸ‘‘

  • set_exception_at_thread_exit β€” sets the result to indicate an exception while delivering the notification only at thread exit (public member function). The dramatic delayed-notification queen 🌈.

Source/version/date check: this page came from http://cppreference.com, with the date 2024.06.10, and the footer badge is std::promis...et_exception(3). Bye bestie β€” go make those futures catch exceptions beautifully πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from