mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
M rpc.py
M run.py Move exception formatting out of rpc.py. This allows each end of the link to format and print exceptions how and where it sees fit and makes it easier for threads to display their own exceptions.
This commit is contained in:
parent
4213e27616
commit
86bc464414
2 changed files with 46 additions and 43 deletions
|
@ -168,50 +168,9 @@ class SocketIO:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
self.debug("localcall:EXCEPTION")
|
self.debug("localcall:EXCEPTION")
|
||||||
if self.debugging: traceback.print_exc(file=sys.__stderr__)
|
traceback.print_exc(file=sys.__stderr__)
|
||||||
efile = sys.stderr
|
|
||||||
typ, val, tb = info = sys.exc_info()
|
|
||||||
sys.last_type, sys.last_value, sys.last_traceback = info
|
|
||||||
tbe = traceback.extract_tb(tb)
|
|
||||||
print >>efile, '\nTraceback (most recent call last):'
|
|
||||||
exclude = ("run.py", "rpc.py", "RemoteDebugger.py", "bdb.py")
|
|
||||||
self.cleanup_traceback(tbe, exclude)
|
|
||||||
traceback.print_list(tbe, file=efile)
|
|
||||||
lines = traceback.format_exception_only(typ, val)
|
|
||||||
for line in lines:
|
|
||||||
print>>efile, line,
|
|
||||||
return ("EXCEPTION", None)
|
return ("EXCEPTION", None)
|
||||||
|
|
||||||
def cleanup_traceback(self, tb, exclude):
|
|
||||||
"Remove excluded traces from beginning/end of tb; get cached lines"
|
|
||||||
orig_tb = tb[:]
|
|
||||||
while tb:
|
|
||||||
for rpcfile in exclude:
|
|
||||||
if tb[0][0].count(rpcfile):
|
|
||||||
break # found an exclude, break for: and delete tb[0]
|
|
||||||
else:
|
|
||||||
break # no excludes, have left RPC code, break while:
|
|
||||||
del tb[0]
|
|
||||||
while tb:
|
|
||||||
for rpcfile in exclude:
|
|
||||||
if tb[-1][0].count(rpcfile):
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
del tb[-1]
|
|
||||||
if len(tb) == 0:
|
|
||||||
# exception was in RPC internals, don't prune!
|
|
||||||
tb[:] = orig_tb[:]
|
|
||||||
print>>sys.stderr, "** IDLE RPC Internal Exception: "
|
|
||||||
for i in range(len(tb)):
|
|
||||||
fn, ln, nm, line = tb[i]
|
|
||||||
if nm == '?':
|
|
||||||
nm = "-toplevel-"
|
|
||||||
if not line and fn.startswith("<pyshell#"):
|
|
||||||
line = self.remotecall('linecache', 'getline',
|
|
||||||
(fn, ln), {})
|
|
||||||
tb[i] = fn, ln, nm, line
|
|
||||||
|
|
||||||
def remotecall(self, oid, methodname, args, kwargs):
|
def remotecall(self, oid, methodname, args, kwargs):
|
||||||
self.debug("remotecall:asynccall: ", oid, methodname)
|
self.debug("remotecall:asynccall: ", oid, methodname)
|
||||||
# XXX KBK 06Feb03 self.interrupted logic may not be necessary if
|
# XXX KBK 06Feb03 self.interrupted logic may not be necessary if
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
|
import traceback
|
||||||
|
|
||||||
import boolcheck
|
import boolcheck
|
||||||
|
|
||||||
|
@ -69,7 +70,50 @@ class Executive:
|
||||||
self.calltip = CallTips.CallTips()
|
self.calltip = CallTips.CallTips()
|
||||||
|
|
||||||
def runcode(self, code):
|
def runcode(self, code):
|
||||||
exec code in self.locals
|
try:
|
||||||
|
exec code in self.locals
|
||||||
|
except:
|
||||||
|
efile = sys.stderr
|
||||||
|
typ, val, tb = info = sys.exc_info()
|
||||||
|
sys.last_type, sys.last_value, sys.last_traceback = info
|
||||||
|
tbe = traceback.extract_tb(tb)
|
||||||
|
print >>efile, '\nTraceback (most recent call last):'
|
||||||
|
exclude = ("run.py", "rpc.py", "RemoteDebugger.py", "bdb.py")
|
||||||
|
self.cleanup_traceback(tbe, exclude)
|
||||||
|
traceback.print_list(tbe, file=efile)
|
||||||
|
lines = traceback.format_exception_only(typ, val)
|
||||||
|
for line in lines:
|
||||||
|
print>>efile, line,
|
||||||
|
|
||||||
|
def cleanup_traceback(self, tb, exclude):
|
||||||
|
"Remove excluded traces from beginning/end of tb; get cached lines"
|
||||||
|
orig_tb = tb[:]
|
||||||
|
while tb:
|
||||||
|
for rpcfile in exclude:
|
||||||
|
if tb[0][0].count(rpcfile):
|
||||||
|
break # found an exclude, break for: and delete tb[0]
|
||||||
|
else:
|
||||||
|
break # no excludes, have left RPC code, break while:
|
||||||
|
del tb[0]
|
||||||
|
while tb:
|
||||||
|
for rpcfile in exclude:
|
||||||
|
if tb[-1][0].count(rpcfile):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
del tb[-1]
|
||||||
|
if len(tb) == 0:
|
||||||
|
# exception was in IDLE internals, don't prune!
|
||||||
|
tb[:] = orig_tb[:]
|
||||||
|
print>>sys.stderr, "** IDLE Internal Exception: "
|
||||||
|
for i in range(len(tb)):
|
||||||
|
fn, ln, nm, line = tb[i]
|
||||||
|
if nm == '?':
|
||||||
|
nm = "-toplevel-"
|
||||||
|
if not line and fn.startswith("<pyshell#"):
|
||||||
|
line = self.rpchandler.remotecall('linecache', 'getline',
|
||||||
|
(fn, ln), {})
|
||||||
|
tb[i] = fn, ln, nm, line
|
||||||
|
|
||||||
def interrupt_the_server(self):
|
def interrupt_the_server(self):
|
||||||
# XXX KBK 05Feb03 Windows requires this be done with messages and
|
# XXX KBK 05Feb03 Windows requires this be done with messages and
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue