Mercurial > cpython-lru_cache-weakref
diff Lib/idlelib/PyShell.py @ 27545:f9822b18cf91 legacy-trunk
M PyShell.py
M rpc.py
SF Bug 676398 Doesn't handle non-built-in exceptions
1. Move exception formatting to the subprocess; allows subclassing of
exceptions, including subclasses created in the shell without
introducing excessive complexity in the RPC mechanism.
2. Provide access to linecache from subprocess to support this.
| author | Kurt B. Kaiser <kbk@shore.net> |
|---|---|
| date | Fri, 31 Jan 2003 05:06:43 +0000 |
| parents | a457531c0fd4 |
| children | 8e7432cdf7d8 |
line wrap: on
line diff
--- a/Lib/idlelib/PyShell.py Fri Jan 31 04:04:23 2003 +0000 +++ b/Lib/idlelib/PyShell.py Fri Jan 31 05:06:43 2003 +0000 @@ -353,6 +353,7 @@ self.rpcclt.register("stdout", self.tkconsole.stdout) self.rpcclt.register("stderr", self.tkconsole.stderr) self.rpcclt.register("flist", self.tkconsole.flist) + self.rpcclt.register("linecache", linecache) self.transfer_path() self.poll_subprocess() @@ -404,23 +405,6 @@ if what is not None: print >>console, `what` elif how == "EXCEPTION": - mod, name, args, tb = what - print >>console, 'Traceback (most recent call last):' - exclude = ("run.py", "rpc.py", "RemoteDebugger.py", "bdb.py") - self.cleanup_traceback(tb, exclude, console) - traceback.print_list(tb, file=console) - # try to reinstantiate the exception, stuff in the args: - try: - etype = eval(mod + '.' + name) - val = etype() - val.args = args - except TypeError: # string exception! - etype = name - val = args - lines = traceback.format_exception_only(etype, val) - for line in lines[:-1]: - traceback._print(console, line, '') - traceback._print(console, lines[-1], '') if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): self.remote_stack_viewer() elif how == "ERROR": @@ -430,36 +414,6 @@ # we received a response to the currently active seq number: self.tkconsole.endexecuting() - def cleanup_traceback(self, tb, exclude, console): - "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: - # error was in IDLE internals, don't prune! - tb[:] = orig_tb[:] - print>>sys.__stderr__, "** IDLE Internal Error: ", tb - print>>console, "** IDLE Internal Error **" - for i in range(len(tb)): - fn, ln, nm, line = tb[i] - if nm == '?': - nm = "-toplevel-" - if not line and fn.startswith("<pyshell#"): - line = linecache.getline(fn, ln) - tb[i] = fn, ln, nm, line - def kill_subprocess(self): clt = self.rpcclt self.rpcclt = None
