@@ -283,7 +283,7 @@ def get(self, timeout=None):
283283 try :
284284 return self ._result
285285 except AttributeError :
286- raise self ._excinfo [ 1 ]. with_traceback ( self . _excinfo [ 2 ])
286+ raise self ._exc
287287
288288 def waitfinish (self , timeout = None ):
289289 if not self ._result_ready .wait (timeout ):
@@ -294,10 +294,8 @@ def run(self):
294294 try :
295295 try :
296296 self ._result = func (* args , ** kwargs )
297- except BaseException :
298- # sys may be already None when shutting down the interpreter
299- if sys is not None :
300- self ._excinfo = sys .exc_info ()
297+ except BaseException as exc :
298+ self ._exc = exc
301299 finally :
302300 self ._result_ready .set ()
303301 self .running = False
@@ -437,10 +435,9 @@ def trace(*msg):
437435 line = " " .join (map (str , msg ))
438436 debugfile .write (line + "\n " )
439437 debugfile .flush ()
440- except Exception :
438+ except Exception as exc :
441439 try :
442- v = sys .exc_info ()[1 ]
443- sys .stderr .write (f"[{ pid } ] exception during tracing: { v !r} \n " )
440+ sys .stderr .write (f"[{ pid } ] exception during tracing: { exc !r} \n " )
444441 except Exception :
445442 pass # nothing we can do, likely interpreter-shutdown
446443
@@ -507,8 +504,7 @@ def from_io(io):
507504 header = io .read (9 ) # type 1, channel 4, payload 4
508505 if not header :
509506 raise EOFError ("empty read" )
510- except EOFError :
511- e = sys .exc_info ()[1 ]
507+ except EOFError as e :
512508 raise EOFError ("couldn't load message header, " + e .args [0 ])
513509 msgtype , channel , payload = struct .unpack ("!bii" , header )
514510 return Message (msgtype , channel , io .read (payload ))
@@ -594,14 +590,20 @@ class GatewayReceivedTerminate(Exception):
594590 """Receiverthread got termination message."""
595591
596592
597- def geterrortext (excinfo , format_exception = traceback .format_exception , sysex = sysex ):
593+ def geterrortext (
594+ exc : BaseException ,
595+ format_exception = traceback .format_exception ,
596+ sysex = sysex ,
597+ ) -> str :
598598 try :
599- l = format_exception (* excinfo ) # noqa:E741
599+ # In py310, can change this to:
600+ # l = format_exception(exc)
601+ l = format_exception (type (exc ), exc , exc .__traceback__ )
600602 errortext = "" .join (l )
601603 except sysex :
602604 raise
603605 except BaseException :
604- errortext = f"{ excinfo [ 0 ] .__name__ } : { excinfo [ 1 ] } "
606+ errortext = f"{ type ( exc ) .__name__ } : { exc } "
605607 return errortext
606608
607609
@@ -937,10 +939,9 @@ def _local_receive(self, id, data):
937939 try :
938940 data = loads_internal (data , channel , strconfig )
939941 callback (data ) # even if channel may be already closed
940- except Exception :
941- excinfo = sys .exc_info ()
942- self .gateway ._trace ("exception during callback: %s" % excinfo [1 ])
943- errortext = self .gateway ._geterrortext (excinfo )
942+ except Exception as exc :
943+ self .gateway ._trace ("exception during callback: %s" % exc )
944+ errortext = self .gateway ._geterrortext (exc )
944945 self .gateway ._send (
945946 Message .CHANNEL_CLOSE_ERROR , id , dumps_internal (errortext )
946947 )
@@ -1017,7 +1018,6 @@ def readline(self):
10171018
10181019
10191020class BaseGateway :
1020- exc_info = sys .exc_info
10211021 _sysex = sysex
10221022 id = "<worker>"
10231023
@@ -1054,11 +1054,11 @@ def log(*msg):
10541054 del msg
10551055 except (KeyboardInterrupt , GatewayReceivedTerminate ):
10561056 pass
1057- except EOFError :
1057+ except EOFError as exc :
10581058 log ("EOF without prior gateway termination message" )
1059- self ._error = self . exc_info ()[ 1 ]
1060- except Exception :
1061- log (self ._geterrortext (self . exc_info () ))
1059+ self ._error = exc
1060+ except Exception as exc :
1061+ log (self ._geterrortext (exc ))
10621062 log ("finishing receiving thread" )
10631063 # wake up and terminate any execution waiting to receive
10641064 self ._channelfactory ._finished_receiving ()
@@ -1079,8 +1079,7 @@ def _send(self, msgcode, channelid=0, data=b""):
10791079 try :
10801080 message .to_io (self ._io )
10811081 self ._trace ("sent" , message )
1082- except (OSError , ValueError ):
1083- e = sys .exc_info ()[1 ]
1082+ except (OSError , ValueError ) as e :
10841083 self ._trace ("failed to send" , message , e )
10851084 # ValueError might be because the IO is already closed
10861085 raise OSError ("cannot send (already closed?)" )
@@ -1166,12 +1165,11 @@ def executetask(self, item):
11661165 except KeyboardInterrupt :
11671166 channel .close (INTERRUPT_TEXT )
11681167 raise
1169- except BaseException :
1170- excinfo = self .exc_info ()
1171- if not isinstance (excinfo [1 ], EOFError ):
1168+ except BaseException as exc :
1169+ if not isinstance (exc , EOFError ):
11721170 if not channel .gateway ._channelfactory .finished :
1173- self ._trace (f"got exception: { excinfo [ 1 ] !r} " )
1174- errortext = self ._geterrortext (excinfo )
1171+ self ._trace (f"got exception: { exc !r} " )
1172+ errortext = self ._geterrortext (exc )
11751173 channel .close (errortext )
11761174 return
11771175 self ._trace ("ignoring EOFError because receiving finished" )
0 commit comments