##// END OF EJS Templates
improved error rendering for cocoa_frontend
Barry Wark -
Show More
@@ -24,6 +24,7 b' __docformat__ = "restructuredtext en"'
24 # Imports
24 # Imports
25 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
26
26
27 import sys
27 import objc
28 import objc
28 import uuid
29 import uuid
29
30
@@ -56,12 +57,29 b' from twisted.python.failure import Failure'
56 class AutoreleasePoolWrappedThreadedEngineService(ThreadedEngineService):
57 class AutoreleasePoolWrappedThreadedEngineService(ThreadedEngineService):
57 """Wrap all blocks in an NSAutoreleasePool"""
58 """Wrap all blocks in an NSAutoreleasePool"""
58
59
59 def wrapped_execute(self, lines):
60 def wrapped_execute(self, msg, lines):
60 """wrapped_execute"""
61 """wrapped_execute"""
61
62 try:
62 p = NSAutoreleasePool.alloc().init()
63 p = NSAutoreleasePool.alloc().init()
63 result = self.shell.execute(lines)
64 result = self.shell.execute(lines)
64 p.drain()
65 except Exception,e:
66 # This gives the following:
67 # et=exception class
68 # ev=exception class instance
69 # tb=traceback object
70 et,ev,tb = sys.exc_info()
71 # This call adds attributes to the exception value
72 et,ev,tb = self.shell.formatTraceback(et,ev,tb,msg)
73 # Add another attribute
74
75 # Create a new exception with the new attributes
76 e = et(ev._ipython_traceback_text)
77 e._ipython_engine_info = msg
78
79 # Re-raise
80 raise e
81 finally:
82 p.drain()
65
83
66 return result
84 return result
67
85
@@ -73,7 +91,7 b' class AutoreleasePoolWrappedThreadedEngineService(ThreadedEngineService):'
73 'method':'execute',
91 'method':'execute',
74 'args':[lines]}
92 'args':[lines]}
75
93
76 d = threads.deferToThread(self.wrapped_execute, lines)
94 d = threads.deferToThread(self.wrapped_execute, msg, lines)
77 d.addCallback(self.addIDToResult)
95 d.addCallback(self.addIDToResult)
78 return d
96 return d
79
97
@@ -241,7 +259,7 b' class IPythonCocoaController(NSObject, FrontEndBase):'
241
259
242 #print inputRange,self.current_block_range()
260 #print inputRange,self.current_block_range()
243 self.insert_text('\n' +
261 self.insert_text('\n' +
244 self.output_prompt(result) +
262 self.output_prompt(number=result['number']) +
245 result.get('display',{}).get('pprint','') +
263 result.get('display',{}).get('pprint','') +
246 '\n\n',
264 '\n\n',
247 textRange=NSMakeRange(inputRange.location+inputRange.length,
265 textRange=NSMakeRange(inputRange.location+inputRange.length,
@@ -250,7 +268,11 b' class IPythonCocoaController(NSObject, FrontEndBase):'
250
268
251
269
252 def render_error(self, failure):
270 def render_error(self, failure):
253 self.insert_text('\n\n'+str(failure)+'\n\n')
271 self.insert_text('\n' +
272 self.output_prompt() +
273 '\n' +
274 failure.getErrorMessage() +
275 '\n\n')
254 self.start_new_block()
276 self.start_new_block()
255 return failure
277 return failure
256
278
@@ -106,13 +106,13 b' class IFrontEnd(zi.Interface):'
106 pass
106 pass
107
107
108
108
109 def input_prompt(number=None):
109 def input_prompt(number=''):
110 """Returns the input prompt by subsituting into
110 """Returns the input prompt by subsituting into
111 self.input_prompt_template
111 self.input_prompt_template
112 """
112 """
113 pass
113 pass
114
114
115 def output_prompt(number=None):
115 def output_prompt(number=''):
116 """Returns the output prompt by subsituting into
116 """Returns the output prompt by subsituting into
117 self.output_prompt_template
117 self.output_prompt_template
118 """
118 """
@@ -180,7 +180,7 b' class FrontEndBase(object):'
180 self.history = history
180 self.history = history
181
181
182
182
183 def input_prompt(self, number=None):
183 def input_prompt(self, number=''):
184 """Returns the current input prompt
184 """Returns the current input prompt
185
185
186 It would be great to use ipython1.core.prompts.Prompt1 here
186 It would be great to use ipython1.core.prompts.Prompt1 here
@@ -193,7 +193,7 b' class FrontEndBase(object):'
193
193
194 return self.continuation_prompt_template.safe_substitute()
194 return self.continuation_prompt_template.safe_substitute()
195
195
196 def output_prompt(self, number=None):
196 def output_prompt(self, number=''):
197 """Returns the output prompt for result"""
197 """Returns the output prompt for result"""
198
198
199 return self.output_prompt_template.safe_substitute({'number':number})
199 return self.output_prompt_template.safe_substitute({'number':number})
General Comments 0
You need to be logged in to leave comments. Login now