Skip to content

Commit 2139d46

Browse files
Set sys.last_traceback on errors (#255)
* Set last traceback * correctly handle SyntaxError * Check if last_traceback is set * Adjust prios * Set exception info in debug too * Check both run and debug * Fixed tests
1 parent 6fd8cde commit 2139d46

File tree

3 files changed

+45
-28
lines changed

3 files changed

+45
-28
lines changed

cq_editor/widgets/debugger.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,9 @@ def render(self):
246246
cq_script)
247247
self.sigLocals.emit(module.__dict__)
248248
except Exception:
249-
self.sigTraceback.emit(sys.exc_info(),
250-
cq_script)
249+
exc_info = sys.exc_info()
250+
sys.last_traceback = exc_info[-1]
251+
self.sigTraceback.emit(exc_info, cq_script)
251252

252253
@property
253254
def breakpoints(self):
@@ -280,7 +281,9 @@ def debug(self,value):
280281
sys.settrace(self.trace_callback)
281282
exec(code,module.__dict__,module.__dict__)
282283
except Exception:
283-
self.sigTraceback.emit(sys.exc_info(),
284+
exc_info = sys.exc_info()
285+
sys.last_traceback = exc_info[-1]
286+
self.sigTraceback.emit(exc_info,
284287
self.script)
285288
finally:
286289
sys.settrace(previous_trace)

cq_editor/widgets/traceback_viewer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,11 @@ def addTraceback(self,exc_info,code):
7676

7777
# handle the special case of a SyntaxError
7878
if t is SyntaxError:
79-
root.addChild(QTreeWidgetItem([exc.filename,
80-
str(exc.lineno),
81-
exc.text.strip()]))
79+
root.addChild(QTreeWidgetItem(
80+
[exc.filename,
81+
str(exc.lineno),
82+
exc.text.strip() if exc.text else '']
83+
))
8284
else:
8385
self.current_exception.setText('')
8486

@@ -91,4 +93,4 @@ def handleSelection(self,item,*args):
9193
if '<string>' in f:
9294
self.sigHighlightLine.emit(line)
9395

94-
96+

tests/test_app.py

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -302,42 +302,40 @@ def test_inspect(main):
302302
insp._toolbar_actions[0].toggled.emit(False)
303303
assert(number_visible_items(viewer) == 3)
304304

305+
class event_loop(object):
306+
'''Used to mock the QEventLoop for the debugger component
307+
'''
305308

306-
def test_debug(main,mocker):
309+
def __init__(self,callbacks):
307310

308-
# store the tracing function
309-
trace_function = sys.gettrace()
311+
self.callbacks = callbacks
312+
self.i = 0
310313

311-
class event_loop(object):
312-
'''Used to mock the QEventLoop for the debugger component
313-
'''
314+
def exec_(self):
315+
316+
if self.i<len(self.callbacks):
317+
self.callbacks[self.i]()
318+
self.i+=1
314319

315-
def __init__(self,callbacks):
320+
def exit(self,*args):
316321

317-
self.callbacks = callbacks
318-
self.i = 0
322+
pass
319323

320-
def exec_(self):
324+
def patch_debugger(debugger,event_loop_mock):
321325

322-
if self.i<len(self.callbacks):
323-
self.callbacks[self.i]()
324-
self.i+=1
326+
debugger.inner_event_loop.exec_ = event_loop_mock.exec_
327+
debugger.inner_event_loop.exit = event_loop_mock.exit
325328

326-
def exit(self,*args):
329+
def test_debug(main,mocker):
327330

328-
pass
331+
# store the tracing function
332+
trace_function = sys.gettrace()
329333

330334
def assert_func(x):
331335
'''Neddedd to perform asserts in lambdas
332336
'''
333337
assert(x)
334338

335-
def patch_debugger(debugger,event_loop_mock):
336-
337-
debugger.inner_event_loop.exec_ = event_loop_mock.exec_
338-
debugger.inner_event_loop.exit = event_loop_mock.exit
339-
340-
341339
qtbot, win = main
342340

343341
#clear all
@@ -491,6 +489,20 @@ def test_traceback(main):
491489
run.triggered.emit()
492490

493491
assert('NameError' in traceback_view.current_exception.text())
492+
assert(hasattr(sys, 'last_traceback'))
493+
494+
del sys.last_traceback
495+
assert(not hasattr(sys, 'last_traceback'))
496+
497+
498+
#test last_traceback with debug
499+
ev = event_loop([lambda: (cont.triggered.emit(),)])
500+
patch_debugger(debugger,ev)
501+
502+
debugger.debug(True)
503+
504+
assert('NameError' in traceback_view.current_exception.text())
505+
assert(hasattr(sys, 'last_traceback'))
494506

495507
# restore the tracing function
496508
sys.settrace(trace_function)

0 commit comments

Comments
 (0)