diff --git a/apps/emqx/src/emqx_misc.erl b/apps/emqx/src/emqx_misc.erl index 10ec4cc4c..6833cbabb 100644 --- a/apps/emqx/src/emqx_misc.erl +++ b/apps/emqx/src/emqx_misc.erl @@ -473,7 +473,14 @@ do_parallel_map(Fun, List) -> fun(Item) -> erlang:spawn_link( fun() -> - Parent ! {self(), Fun(Item)} + Res = + try + {normal, Fun(Item)} + catch + C:E:St -> + {exception, {C, E, St}} + end, + Parent ! {self(), Res} end ) end, @@ -482,8 +489,10 @@ do_parallel_map(Fun, List) -> lists:foldr( fun(Pid, Acc) -> receive - {Pid, Result} -> - [Result | Acc] + {Pid, {normal, Result}} -> + [Result | Acc]; + {Pid, {exception, {C, E, St}}} -> + erlang:raise(C, E, St) end end, [], diff --git a/apps/emqx/test/emqx_misc_SUITE.erl b/apps/emqx/test/emqx_misc_SUITE.erl index c7f7b1be7..e3227d94c 100644 --- a/apps/emqx/test/emqx_misc_SUITE.erl +++ b/apps/emqx/test/emqx_misc_SUITE.erl @@ -194,8 +194,8 @@ t_pmap_timeout(_) -> ). t_pmap_exception(_) -> - ?assertExit( - {foobar, _}, + ?assertError( + foobar, emqx_misc:pmap( fun (error) -> error(foobar);