@@ -289,7 +289,7 @@ def get(self, timeout=None):
289289 try :
290290 return self ._result
291291 except AttributeError :
292- raise self ._excinfo [ 1 ]. with_traceback ( self . _excinfo [ 2 ])
292+ raise self ._exc
293293
294294 def waitfinish (self , timeout = None ):
295295 if not self ._result_ready .wait (timeout ):
@@ -300,10 +300,8 @@ def run(self):
300300 try :
301301 try :
302302 self ._result = func (* args , ** kwargs )
303- except BaseException :
304- # sys may be already None when shutting down the interpreter
305- if sys is not None :
306- self ._excinfo = sys .exc_info ()
303+ except BaseException as exc :
304+ self ._exc = exc
307305 finally :
308306 self ._result_ready .set ()
309307 self .running = False
@@ -460,10 +458,9 @@ def trace(*msg):
460458 line = " " .join (map (str , msg ))
461459 debugfile .write (line + "\n " )
462460 debugfile .flush ()
463- except Exception :
461+ except Exception as exc :
464462 try :
465- v = sys .exc_info ()[1 ]
466- sys .stderr .write (f"[{ pid } ] exception during tracing: { v !r} \n " )
463+ sys .stderr .write (f"[{ pid } ] exception during tracing: { exc !r} \n " )
467464 except Exception :
468465 pass # nothing we can do, likely interpreter-shutdown
469466
@@ -530,8 +527,7 @@ def from_io(io):
530527 header = io .read (9 ) # type 1, channel 4, payload 4
531528 if not header :
532529 raise EOFError ("empty read" )
533- except EOFError :
534- e = sys .exc_info ()[1 ]
530+ except EOFError as e :
535531 raise EOFError ("couldn't load message header, " + e .args [0 ])
536532 msgtype , channel , payload = struct .unpack ("!bii" , header )
537533 return Message (msgtype , channel , io .read (payload ))
@@ -617,14 +613,20 @@ class GatewayReceivedTerminate(Exception):
617613 """Receiverthread got termination message."""
618614
619615
620- def geterrortext (excinfo , format_exception = traceback .format_exception , sysex = sysex ):
616+ def geterrortext (
617+ exc : BaseException ,
618+ format_exception = traceback .format_exception ,
619+ sysex = sysex ,
620+ ) -> str :
621621 try :
622- l = format_exception (* excinfo ) # noqa:E741
622+ # In py310, can change this to:
623+ # l = format_exception(exc)
624+ l = format_exception (type (exc ), exc , exc .__traceback__ )
623625 errortext = "" .join (l )
624626 except sysex :
625627 raise
626628 except BaseException :
627- errortext = f"{ excinfo [ 0 ] .__name__ } : { excinfo [ 1 ] } "
629+ errortext = f"{ type ( exc ) .__name__ } : { exc } "
628630 return errortext
629631
630632
@@ -963,10 +965,9 @@ def _local_receive(self, id, data):
963965 try :
964966 data = loads_internal (data , channel , strconfig )
965967 callback (data ) # even if channel may be already closed
966- except Exception :
967- excinfo = sys .exc_info ()
968- self .gateway ._trace ("exception during callback: %s" % excinfo [1 ])
969- errortext = self .gateway ._geterrortext (excinfo )
968+ except Exception as exc :
969+ self .gateway ._trace ("exception during callback: %s" % exc )
970+ errortext = self .gateway ._geterrortext (exc )
970971 self .gateway ._send (
971972 Message .CHANNEL_CLOSE_ERROR , id , dumps_internal (errortext )
972973 )
@@ -1043,7 +1044,6 @@ def readline(self):
10431044
10441045
10451046class BaseGateway :
1046- exc_info = sys .exc_info
10471047 _sysex = sysex
10481048 id = "<worker>"
10491049
@@ -1080,11 +1080,11 @@ def log(*msg):
10801080 del msg
10811081 except (KeyboardInterrupt , GatewayReceivedTerminate ):
10821082 pass
1083- except EOFError :
1083+ except EOFError as exc :
10841084 log ("EOF without prior gateway termination message" )
1085- self ._error = self . exc_info ()[ 1 ]
1086- except Exception :
1087- log (self ._geterrortext (self . exc_info () ))
1085+ self ._error = exc
1086+ except Exception as exc :
1087+ log (self ._geterrortext (exc ))
10881088 log ("finishing receiving thread" )
10891089 # wake up and terminate any execution waiting to receive
10901090 self ._channelfactory ._finished_receiving ()
@@ -1105,8 +1105,7 @@ def _send(self, msgcode, channelid=0, data=b""):
11051105 try :
11061106 message .to_io (self ._io )
11071107 self ._trace ("sent" , message )
1108- except (OSError , ValueError ):
1109- e = sys .exc_info ()[1 ]
1108+ except (OSError , ValueError ) as e :
11101109 self ._trace ("failed to send" , message , e )
11111110 # ValueError might be because the IO is already closed
11121111 raise OSError ("cannot send (already closed?)" )
@@ -1212,12 +1211,11 @@ def executetask(self, item):
12121211 except KeyboardInterrupt :
12131212 channel .close (INTERRUPT_TEXT )
12141213 raise
1215- except BaseException :
1216- excinfo = self .exc_info ()
1217- if not isinstance (excinfo [1 ], EOFError ):
1214+ except BaseException as exc :
1215+ if not isinstance (exc , EOFError ):
12181216 if not channel .gateway ._channelfactory .finished :
1219- self ._trace (f"got exception: { excinfo [ 1 ] !r} " )
1220- errortext = self ._geterrortext (excinfo )
1217+ self ._trace (f"got exception: { exc !r} " )
1218+ errortext = self ._geterrortext (exc )
12211219 channel .close (errortext )
12221220 return
12231221 self ._trace ("ignoring EOFError because receiving finished" )
0 commit comments