@@ -283,7 +283,7 @@ def get(self, timeout=None):
283
283
try :
284
284
return self ._result
285
285
except AttributeError :
286
- raise self ._excinfo [ 1 ]. with_traceback ( self . _excinfo [ 2 ])
286
+ raise self ._exc
287
287
288
288
def waitfinish (self , timeout = None ):
289
289
if not self ._result_ready .wait (timeout ):
@@ -294,10 +294,8 @@ def run(self):
294
294
try :
295
295
try :
296
296
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
301
299
finally :
302
300
self ._result_ready .set ()
303
301
self .running = False
@@ -437,10 +435,9 @@ def trace(*msg):
437
435
line = " " .join (map (str , msg ))
438
436
debugfile .write (line + "\n " )
439
437
debugfile .flush ()
440
- except Exception :
438
+ except Exception as exc :
441
439
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 " )
444
441
except Exception :
445
442
pass # nothing we can do, likely interpreter-shutdown
446
443
@@ -507,8 +504,7 @@ def from_io(io):
507
504
header = io .read (9 ) # type 1, channel 4, payload 4
508
505
if not header :
509
506
raise EOFError ("empty read" )
510
- except EOFError :
511
- e = sys .exc_info ()[1 ]
507
+ except EOFError as e :
512
508
raise EOFError ("couldn't load message header, " + e .args [0 ])
513
509
msgtype , channel , payload = struct .unpack ("!bii" , header )
514
510
return Message (msgtype , channel , io .read (payload ))
@@ -594,14 +590,20 @@ class GatewayReceivedTerminate(Exception):
594
590
"""Receiverthread got termination message."""
595
591
596
592
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 :
598
598
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__ )
600
602
errortext = "" .join (l )
601
603
except sysex :
602
604
raise
603
605
except BaseException :
604
- errortext = f"{ excinfo [ 0 ] .__name__ } : { excinfo [ 1 ] } "
606
+ errortext = f"{ type ( exc ) .__name__ } : { exc } "
605
607
return errortext
606
608
607
609
@@ -937,10 +939,9 @@ def _local_receive(self, id, data):
937
939
try :
938
940
data = loads_internal (data , channel , strconfig )
939
941
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 )
944
945
self .gateway ._send (
945
946
Message .CHANNEL_CLOSE_ERROR , id , dumps_internal (errortext )
946
947
)
@@ -1017,7 +1018,6 @@ def readline(self):
1017
1018
1018
1019
1019
1020
class BaseGateway :
1020
- exc_info = sys .exc_info
1021
1021
_sysex = sysex
1022
1022
id = "<worker>"
1023
1023
@@ -1054,11 +1054,11 @@ def log(*msg):
1054
1054
del msg
1055
1055
except (KeyboardInterrupt , GatewayReceivedTerminate ):
1056
1056
pass
1057
- except EOFError :
1057
+ except EOFError as exc :
1058
1058
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 ))
1062
1062
log ("finishing receiving thread" )
1063
1063
# wake up and terminate any execution waiting to receive
1064
1064
self ._channelfactory ._finished_receiving ()
@@ -1079,8 +1079,7 @@ def _send(self, msgcode, channelid=0, data=b""):
1079
1079
try :
1080
1080
message .to_io (self ._io )
1081
1081
self ._trace ("sent" , message )
1082
- except (OSError , ValueError ):
1083
- e = sys .exc_info ()[1 ]
1082
+ except (OSError , ValueError ) as e :
1084
1083
self ._trace ("failed to send" , message , e )
1085
1084
# ValueError might be because the IO is already closed
1086
1085
raise OSError ("cannot send (already closed?)" )
@@ -1166,12 +1165,11 @@ def executetask(self, item):
1166
1165
except KeyboardInterrupt :
1167
1166
channel .close (INTERRUPT_TEXT )
1168
1167
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 ):
1172
1170
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 )
1175
1173
channel .close (errortext )
1176
1174
return
1177
1175
self ._trace ("ignoring EOFError because receiving finished" )
0 commit comments