Group: Enable aggregate exception to be passed as ptr

This commit is contained in:
2026-06-07 19:33:42 -04:00
parent edde8f4a64
commit 44894299b4
2 changed files with 37 additions and 5 deletions
+16 -5
View File
@@ -564,10 +564,10 @@ struct Group
memberAdapterCoro(memberInvoker, settlementIndex); memberAdapterCoro(memberInvoker, settlementIndex);
} }
void checkForAndReThrowGroupExceptions() const std::exception_ptr captureAggregatedGroupExceptions() const
{ {
std::ostringstream ostream; std::ostringstream ostream;
bool doThrow = false; bool hasFailures = false;
for (auto &item : s.rsrc.settlements) for (auto &item : s.rsrc.settlements)
{ {
@@ -577,7 +577,7 @@ struct Group
assert(item.calleeException); assert(item.calleeException);
doThrow = true; hasFailures = true;
ostream << "Exc thrown in Group Adapter: "; ostream << "Exc thrown in Group Adapter: ";
try { try {
std::rethrow_exception(item.calleeException); std::rethrow_exception(item.calleeException);
@@ -589,8 +589,19 @@ struct Group
ostream << "\n"; ostream << "\n";
} }
if (doThrow) { if (!hasFailures) {
throw std::runtime_error(ostream.str()); return nullptr;
}
return std::make_exception_ptr(std::runtime_error(ostream.str()));
}
void checkForAndReThrowGroupExceptions() const
{
std::exception_ptr aggregatedException =
captureAggregatedGroupExceptions();
if (aggregatedException) {
std::rethrow_exception(aggregatedException);
} }
} }
@@ -1,6 +1,8 @@
#ifndef MULTI_OPERATION_RESULT_SET_H #ifndef MULTI_OPERATION_RESULT_SET_H
#define MULTI_OPERATION_RESULT_SET_H #define MULTI_OPERATION_RESULT_SET_H
#include <exception>
namespace sscl { namespace sscl {
/** Plain aggregate for fan-out / fan-in results returned from coroutines. */ /** Plain aggregate for fan-out / fan-in results returned from coroutines. */
@@ -24,6 +26,25 @@ struct MultiOperationResultSet
unsigned int nFailed; unsigned int nFailed;
}; };
/** Fan-out / fan-in counts plus optional aggregated member failure. */
struct MultiOperationResultSetWithException
{
MultiOperationResultSetWithException() = default;
MultiOperationResultSetWithException(
MultiOperationResultSet resultsIn,
std::exception_ptr memberFailureExceptionIn = nullptr)
: results(resultsIn),
memberFailureException(memberFailureExceptionIn)
{}
bool hasMemberFailure() const
{ return memberFailureException != nullptr; }
MultiOperationResultSet results;
std::exception_ptr memberFailureException = nullptr;
};
} // namespace sscl } // namespace sscl
#endif // MULTI_OPERATION_RESULT_SET_H #endif // MULTI_OPERATION_RESULT_SET_H