diff --git a/src/paimon/common/executor/default_executor_test.cpp b/src/paimon/common/executor/default_executor_test.cpp index 182845df..61457ab3 100644 --- a/src/paimon/common/executor/default_executor_test.cpp +++ b/src/paimon/common/executor/default_executor_test.cpp @@ -74,4 +74,10 @@ TEST(DefaultExecutorTest, TestViaWithResult) { ASSERT_EQ(4, results.size()); } +TEST(DefaultExecutorTest, TestViaWithException) { + auto executor = GetGlobalDefaultExecutor(); + auto future = Via(executor.get(), []() { throw std::runtime_error("test"); }); + ASSERT_THROW(future.get(), std::runtime_error); +} + } // namespace paimon::test diff --git a/src/paimon/common/executor/future.h b/src/paimon/common/executor/future.h index 9f140fb8..fe6509a2 100644 --- a/src/paimon/common/executor/future.h +++ b/src/paimon/common/executor/future.h @@ -66,11 +66,15 @@ auto Via(Executor* executor, Func&& func) -> std::future { // Wrap the task and submit it to the executor. executor->Add([promise, func = std::forward(func)]() mutable { - if constexpr (std::is_void_v) { - func(); - promise->set_value(); - } else { - promise->set_value(func()); + try { + if constexpr (std::is_void_v) { + func(); + promise->set_value(); + } else { + promise->set_value(func()); + } + } catch (...) { + promise->set_exception(std::current_exception()); } });