@@ -289,7 +289,7 @@ def get(self, timeout=None):
289
289
try :
290
290
return self ._result
291
291
except AttributeError :
292
- raise self ._excinfo [ 1 ]. with_traceback ( self . _excinfo [ 2 ])
292
+ raise self ._exc
293
293
294
294
def waitfinish (self , timeout = None ):
295
295
if not self ._result_ready .wait (timeout ):
@@ -300,10 +300,8 @@ def run(self):
300
300
try :
301
301
try :
302
302
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
307
305
finally :
308
306
self ._result_ready .set ()
309
307
self .running = False
@@ -460,10 +458,9 @@ def trace(*msg):
460
458
line = " " .join (map (str , msg ))
461
459
debugfile .write (line + "\n " )
462
460
debugfile .flush ()
463
- except Exception :
461
+ except Exception as exc :
464
462
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 " )
467
464
except Exception :
468
465
pass # nothing we can do, likely interpreter-shutdown
469
466
@@ -530,8 +527,7 @@ def from_io(io):
530
527
header = io .read (9 ) # type 1, channel 4, payload 4
531
528
if not header :
532
529
raise EOFError ("empty read" )
533
- except EOFError :
534
- e = sys .exc_info ()[1 ]
530
+ except EOFError as e :
535
531
raise EOFError ("couldn't load message header, " + e .args [0 ])
536
532
msgtype , channel , payload = struct .unpack ("!bii" , header )
537
533
return Message (msgtype , channel , io .read (payload ))
@@ -617,14 +613,20 @@ class GatewayReceivedTerminate(Exception):
617
613
"""Receiverthread got termination message."""
618
614
619
615
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 :
621
621
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__ )
623
625
errortext = "" .join (l )
624
626
except sysex :
625
627
raise
626
628
except BaseException :
627
- errortext = f"{ excinfo [ 0 ] .__name__ } : { excinfo [ 1 ] } "
629
+ errortext = f"{ type ( exc ) .__name__ } : { exc } "
628
630
return errortext
629
631
630
632
@@ -963,10 +965,9 @@ def _local_receive(self, id, data):
963
965
try :
964
966
data = loads_internal (data , channel , strconfig )
965
967
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 )
970
971
self .gateway ._send (
971
972
Message .CHANNEL_CLOSE_ERROR , id , dumps_internal (errortext )
972
973
)
@@ -1043,7 +1044,6 @@ def readline(self):
1043
1044
1044
1045
1045
1046
class BaseGateway :
1046
- exc_info = sys .exc_info
1047
1047
_sysex = sysex
1048
1048
id = "<worker>"
1049
1049
@@ -1080,11 +1080,11 @@ def log(*msg):
1080
1080
del msg
1081
1081
except (KeyboardInterrupt , GatewayReceivedTerminate ):
1082
1082
pass
1083
- except EOFError :
1083
+ except EOFError as exc :
1084
1084
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 ))
1088
1088
log ("finishing receiving thread" )
1089
1089
# wake up and terminate any execution waiting to receive
1090
1090
self ._channelfactory ._finished_receiving ()
@@ -1105,8 +1105,7 @@ def _send(self, msgcode, channelid=0, data=b""):
1105
1105
try :
1106
1106
message .to_io (self ._io )
1107
1107
self ._trace ("sent" , message )
1108
- except (OSError , ValueError ):
1109
- e = sys .exc_info ()[1 ]
1108
+ except (OSError , ValueError ) as e :
1110
1109
self ._trace ("failed to send" , message , e )
1111
1110
# ValueError might be because the IO is already closed
1112
1111
raise OSError ("cannot send (already closed?)" )
@@ -1212,12 +1211,11 @@ def executetask(self, item):
1212
1211
except KeyboardInterrupt :
1213
1212
channel .close (INTERRUPT_TEXT )
1214
1213
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 ):
1218
1216
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 )
1221
1219
channel .close (errortext )
1222
1220
return
1223
1221
self ._trace ("ignoring EOFError because receiving finished" )
0 commit comments