c++ - std::rethrow_exception with std::current_exception - Stack Overflow

时间: 2025-01-06 admin 业界

Just fumbling around with exceptions for no further reason. In C++20, I noticed a behaviour around the std::rethrow_exception function when used with nested exceptions and std::current_exception.

Consider this example:

#include <iostream>
#include <exception>

using namespace std;

int main()
{
    struct B {
        B(int ii): i(ii) { }
        virtual ~B() { }
        int i;
    };

    try {
        try {
            throw B(1);
        }
        catch (const B &b) {
            std::throw_with_nested(B(2));
        }
    }
    catch (const B &b) {
        cout << "B" << b.i << endl;

        try {
            std::rethrow_if_nested(b); // works
            //std::rethrow_if_nested(std::current_exception()); // doesn't work
        }
        catch (const B &b2) {
            cout << "B" << b2.i << endl;
        }
    }
}

If I rethrow the exception b itself, I get the following output:

B2
B1

This is what I expected. The outer catch block gets the outer exception, then rethrows it so that the second catch block gets the inner/nested exception.

However, when I change the commented lines, I suddenly only get B2 and the inner/nested exception seems to be lost. This also happens e.g., when the exception is captured in an std::exception_ptr midway.

How is that?

最新文章