Add custom exceptions with msg (un)packing
							parent
							
								
									71bb87aa3a
								
							
						
					
					
						commit
						2f6609ab78
					
				|  | @ -0,0 +1,50 @@ | |||
| """ | ||||
| Our classy exception set. | ||||
| """ | ||||
| import builtins | ||||
| import traceback | ||||
| 
 | ||||
| 
 | ||||
| class RemoteActorError(Exception): | ||||
|     # TODO: local recontruction of remote exception deats | ||||
|     "Remote actor exception bundled locally" | ||||
|     def __init__(self, message, type_str, **msgdata): | ||||
|         super().__init__(message) | ||||
|         self.type = getattr(builtins, type_str, Exception) | ||||
|         self.msgdata = msgdata | ||||
| 
 | ||||
|     # TODO: a trio.MultiError.catch like context manager | ||||
|     # for catching underlying remote errors of a particular type | ||||
| 
 | ||||
| 
 | ||||
| class InternalActorError(RemoteActorError): | ||||
|     """Remote internal ``tractor`` error indicating | ||||
|     failure of some primitive or machinery. | ||||
|     """ | ||||
| 
 | ||||
| 
 | ||||
| class NoResult(RuntimeError): | ||||
|     "No final result is expected for this actor" | ||||
| 
 | ||||
| 
 | ||||
| def pack_error(exc): | ||||
|     """Create an "error message" for tranmission over | ||||
|     a channel (aka the wire). | ||||
|     """ | ||||
|     return { | ||||
|         'error': { | ||||
|             'tb_str': traceback.format_exc(), | ||||
|             'type_str': type(exc).__name__, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| def unpack_error(msg, chan=None): | ||||
|     """Unpack an 'error' message from the wire | ||||
|     into a local ``RemoteActorError``. | ||||
|     """ | ||||
|     tb_str = msg['error'].get('tb_str', '') | ||||
|     return RemoteActorError( | ||||
|         f"{chan.uid}\n" + tb_str, | ||||
|         **msg['error'], | ||||
|     ) | ||||
		Loading…
	
		Reference in New Issue