Skip to content

Commit 1900890

Browse files
authored
Merge pull request #247 from bluetech/no-sys-exc-info
Avoid using sys.exc_info
2 parents 678df09 + 5cdc09f commit 1900890

File tree

6 files changed

+40
-48
lines changed

6 files changed

+40
-48
lines changed

src/execnet/gateway.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import inspect
66
import linecache
77
import os
8-
import sys
98
import textwrap
109
import types
1110

@@ -56,10 +55,9 @@ def exit(self):
5655
self._send(Message.GATEWAY_TERMINATE)
5756
self._trace("--> io.close_write")
5857
self._io.close_write()
59-
except (ValueError, EOFError, OSError):
60-
v = sys.exc_info()[1]
58+
except (ValueError, EOFError, OSError) as exc:
6159
self._trace("io-error: could not send termination sequence")
62-
self._trace(" exception: %r" % v)
60+
self._trace(" exception: %r" % exc)
6361

6462
def reconfigure(self, py2str_as_py3str=True, py3str_as_py2str=False):
6563
"""

src/execnet/gateway_base.py

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10451046
class 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")

src/execnet/gateway_socket.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,6 @@ def create_io(spec, group, execmodel):
8484
io.remoteaddress = "%s:%d" % (host, port)
8585
try:
8686
sock.connect((host, port))
87-
except execmodel.socket.gaierror:
88-
raise HostNotFound(str(sys.exc_info()[1]))
87+
except execmodel.socket.gaierror as e:
88+
raise HostNotFound() from e
8989
return io

src/execnet/multi.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
(c) 2008-2014, Holger Krekel and others
55
"""
66
import atexit
7-
import sys
87
from functools import partial
98
from threading import Lock
109

@@ -285,11 +284,11 @@ def waitclose(self):
285284
for ch in self._channels:
286285
try:
287286
ch.waitclose()
288-
except ch.RemoteError:
287+
except ch.RemoteError as exc:
289288
if first is None:
290-
first = sys.exc_info()
289+
first = exc
291290
if first:
292-
raise first[1].with_traceback(first[2])
291+
raise first
293292

294293

295294
def safe_terminate(execmodel, timeout, list_of_paired_functions):

src/execnet/script/socketserver.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,13 @@ def startserver(serversock, loop=False):
9494
exec_from_one_connection(serversock)
9595
except (KeyboardInterrupt, SystemExit):
9696
raise
97-
except BaseException:
97+
except BaseException as exc:
9898
if debug:
9999
import traceback
100100

101101
traceback.print_exc()
102102
else:
103-
excinfo = sys.exc_info()
104-
print_("got exception", excinfo[1])
103+
print_("got exception", exc)
105104
os.chdir(execute_path)
106105
if not loop:
107106
break

testing/test_basics.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,14 @@ def test_geterrortext(checker):
229229
out = checker.run_check(
230230
inspect.getsource(gateway_base)
231231
+ """
232-
class Arg:
232+
class Arg(Exception):
233233
pass
234-
errortext = geterrortext((Arg, "1", 4))
234+
errortext = geterrortext(Arg())
235235
assert "Arg" in errortext
236-
import sys
237236
try:
238237
raise ValueError("17")
239-
except ValueError:
240-
excinfo = sys.exc_info()
241-
s = geterrortext(excinfo)
238+
except ValueError as exc:
239+
s = geterrortext(exc)
242240
assert "17" in s
243241
print ("all passed")
244242
"""

0 commit comments

Comments
 (0)