@@ -582,7 +582,7 @@ async def update_resource(self, resources: List["ResourcePLR"]):
582582 except Exception as e :
583583 self .lab_logger ().error (f"更新资源uuid失败: { e } " )
584584 self .lab_logger ().error (traceback .format_exc ())
585- self .lab_logger ().debug (f"资源更新结果: { response } " )
585+ self .lab_logger ().trace (f"资源更新结果: { response } " )
586586
587587 async def get_resource (self , resources_uuid : List [str ], with_children : bool = True ) -> ResourceTreeSet :
588588 """
@@ -1164,43 +1164,43 @@ def ACTION(**kwargs):
11641164 execution_error = traceback .format_exc ()
11651165 break
11661166
1167- ##### self.lab_logger().info(f"准备执行: {action_kwargs}, 函数: {ACTION.__name__}")
11681167 time_start = time .time ()
11691168 time_overall = 100
11701169 future = None
11711170 if not error_skip :
11721171 # 将阻塞操作放入线程池执行
11731172 if asyncio .iscoroutinefunction (ACTION ):
11741173 try :
1175- ##### self.lab_logger().info(f"异步执行动作 {ACTION}")
1176- future = ROS2DeviceNode .run_async_func (ACTION , trace_error = False , ** action_kwargs )
1177-
1178- def _handle_future_exception (fut ):
1174+ self .lab_logger ().trace (f"异步执行动作 { ACTION } " )
1175+ def _handle_future_exception (fut : Future ):
11791176 nonlocal execution_error , execution_success , action_return_value
11801177 try :
11811178 action_return_value = fut .result ()
1179+ if isinstance (action_return_value , BaseException ):
1180+ raise action_return_value
11821181 execution_success = True
1183- except Exception as e :
1182+ except Exception as _ :
11841183 execution_error = traceback .format_exc ()
11851184 error (
11861185 f"异步任务 { ACTION .__name__ } 报错了\n { traceback .format_exc ()} \n 原始输入:{ action_kwargs } "
11871186 )
11881187
1188+ future = ROS2DeviceNode .run_async_func (ACTION , trace_error = False , ** action_kwargs )
11891189 future .add_done_callback (_handle_future_exception )
11901190 except Exception as e :
11911191 execution_error = traceback .format_exc ()
11921192 execution_success = False
11931193 self .lab_logger ().error (f"创建异步任务失败: { traceback .format_exc ()} " )
11941194 else :
1195- ##### self.lab_logger().info (f"同步执行动作 {ACTION}")
1195+ self .lab_logger ().trace (f"同步执行动作 { ACTION } " )
11961196 future = self ._executor .submit (ACTION , ** action_kwargs )
11971197
1198- def _handle_future_exception (fut ):
1198+ def _handle_future_exception (fut : Future ):
11991199 nonlocal execution_error , execution_success , action_return_value
12001200 try :
12011201 action_return_value = fut .result ()
12021202 execution_success = True
1203- except Exception as e :
1203+ except Exception as _ :
12041204 execution_error = traceback .format_exc ()
12051205 error (
12061206 f"同步任务 { ACTION .__name__ } 报错了\n { traceback .format_exc ()} \n 原始输入:{ action_kwargs } "
@@ -1305,7 +1305,7 @@ def _handle_future_exception(fut):
13051305 get_result_info_str (execution_error , execution_success , action_return_value ),
13061306 )
13071307
1308- ##### self.lab_logger().info (f"动作 {action_name} 完成并返回结果")
1308+ self .lab_logger ().trace (f"动作 { action_name } 完成并返回结果" )
13091309 return result_msg
13101310
13111311 return execute_callback
@@ -1540,17 +1540,29 @@ class ROS2DeviceNode:
15401540 这个类封装了设备类实例和ROS2节点的功能,提供ROS2接口。
15411541 它不继承设备类,而是通过代理模式访问设备类的属性和方法。
15421542 """
1543+ @staticmethod
1544+ async def safe_task_wrapper (trace_callback , func , ** kwargs ):
1545+ try :
1546+ if callable (trace_callback ):
1547+ trace_callback (await func (** kwargs ))
1548+ return await func (** kwargs )
1549+ except Exception as e :
1550+ if callable (trace_callback ):
1551+ trace_callback (e )
1552+ return e
15431553
15441554 @classmethod
1545- def run_async_func (cls , func , trace_error = True , ** kwargs ) -> Task :
1546- def _handle_future_exception (fut ):
1555+ def run_async_func (cls , func , trace_error = True , inner_trace_callback = None , ** kwargs ) -> Task :
1556+ def _handle_future_exception (fut : Future ):
15471557 try :
1548- fut .result ()
1558+ ret = fut .result ()
1559+ if isinstance (ret , BaseException ):
1560+ raise ret
15491561 except Exception as e :
1550- error (f"异步任务 { func .__name__ } 报错了 " )
1562+ error (f"异步任务 { func .__name__ } 获取结果失败 " )
15511563 error (traceback .format_exc ())
15521564
1553- future = rclpy .get_global_executor ().create_task (func ( ** kwargs ))
1565+ future = rclpy .get_global_executor ().create_task (ROS2DeviceNode . safe_task_wrapper ( inner_trace_callback , func , ** kwargs ))
15541566 if trace_error :
15551567 future .add_done_callback (_handle_future_exception )
15561568 return future
0 commit comments