From 9f0fc3dd1373efe0afe511fd45826188c9de88d6 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Sat, 10 Nov 2007 13:09:33 -0500 Subject: [PATCH] * Add a warning line to the output when copy.copy() throws an exception * Improve the formatting of errors --- lib/reinteract/shell_buffer.py | 14 ++++++++++++-- lib/reinteract/statement.py | 23 ++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/reinteract/shell_buffer.py b/lib/reinteract/shell_buffer.py index 2df0adf..80d6d18 100755 --- a/lib/reinteract/shell_buffer.py +++ b/lib/reinteract/shell_buffer.py @@ -5,7 +5,7 @@ import traceback import os import re from notebook import Notebook -from statement import Statement, ExecutionError +from statement import Statement, ExecutionError, WarningResult from worksheet import Worksheet from custom_result import CustomResult import tokenize @@ -97,7 +97,10 @@ class StatementChunk: self.statement.execute() self.results = self.statement.results except ExecutionError, e: - self.error_message = "\n".join(traceback.format_tb(e.traceback)[2:]) + "\n" + str(e.cause) + self.error_message = "\n".join(traceback.format_tb(e.traceback)[2:]) + "\n".join(traceback.format_exception_only(e.type, e.value)) + if self.error_message.endswith("\n"): + self.error_message = self.error_message[0:-1] + self.error_line = e.traceback.tb_frame.f_lineno self.error_offset = None @@ -164,6 +167,7 @@ class ShellBuffer(gtk.TextBuffer, Worksheet): self.__result_tag = self.create_tag(family="monospace", style="italic", wrap_mode=gtk.WRAP_WORD, editable=False) # Order here is significant ... we want the recompute tag to have higher priority, so # define it second + self.__warning_tag = self.create_tag(foreground="#aa8800") self.__error_tag = self.create_tag(foreground="#aa0000") self.__recompute_tag = self.create_tag(foreground="#888888") self.__comment_tag = self.create_tag(foreground="#3f7f5f") @@ -1041,6 +1045,12 @@ class ShellBuffer(gtk.TextBuffer, Worksheet): for result in results: if isinstance(result, basestring): self.insert(location, "\n" + result) + elif isinstance(result, WarningResult): + start_mark = self.create_mark(None, location, True) + self.insert(location, "\n" + result.message) + start = self.get_iter_at_mark(start_mark) + self.delete_mark(start_mark) + self.apply_tag(self.__warning_tag, start, location) elif isinstance(result, CustomResult): self.insert(location, "\n") anchor = self.create_child_anchor(location) diff --git a/lib/reinteract/statement.py b/lib/reinteract/statement.py index 4a51c5d..ffc0deb 100755 --- a/lib/reinteract/statement.py +++ b/lib/reinteract/statement.py @@ -8,13 +8,18 @@ from custom_result import CustomResult # A wrapper so we don't have to trap all exceptions when running statement.Execute class ExecutionError(Exception): - def __init__(self, cause, traceback): - self.cause = cause + def __init__(self, type, value, traceback): + self.type = type + self.value = value self.traceback = traceback def __str__(self): return "ExecutionError: " + str(self.cause) +class WarningResult(object): + def __init__(self, message): + self.message = message + class Statement: def __init__(self, text, worksheet, parent = None): self.__text = text @@ -58,24 +63,28 @@ class Statement: else: scope = copy.copy(root_scope) + self.results = [] + self.result_scope = scope + for mutation in self.__mutated: if isinstance(mutation, tuple): variable, method = mutation else: variable = mutation - scope[variable] = copy.copy(scope[variable]) + try: + scope[variable] = copy.copy(scope[variable]) + except: + self.results.append(WarningResult("Variable '%s' apparently modified, but can't copy it" % variable)) - self.results = [] - self.result_scope = scope root_scope['__reinteract_statement'] = self try: exec self.__compiled in scope, scope except: self.results = None self.result_scope = None - _, cause, traceback = sys.exc_info() - raise ExecutionError(cause, traceback) + type, value, traceback = sys.exc_info() + raise ExecutionError(type, value, traceback) finally: root_scope['__reinteract_statement'] = None -- 2.11.4.GIT