diff --git a/tests/ptvsd/highlevel/__init__.py b/tests/ptvsd/highlevel/__init__.py
index 2ae35303..39b86524 100644
--- a/tests/ptvsd/highlevel/__init__.py
+++ b/tests/ptvsd/highlevel/__init__.py
@@ -13,6 +13,8 @@ from _pydevd_bundle.pydevd_comm import (
CMD_THREAD_SUSPEND,
CMD_RETURN,
CMD_RUN,
+ CMD_STEP_CAUGHT_EXCEPTION,
+ CMD_SEND_CURR_EXCEPTION_TRACE,
)
from tests.helpers.pydevd import FakePyDevd
@@ -72,10 +74,9 @@ class PyDevdMessages(object):
text += ''
return text
- def format_frames(self, thread, reason, *frames):
- tid, _ = thread # (tid, tname)
+ def format_frames(self, threadid, reason, *frames):
text = ''
- text += ''.format(tid, reason)
+ text += ''.format(threadid, reason)
fmt = ''
for frame in frames: # (fid, func, filename, line)
text += fmt.format(*frame)
@@ -90,6 +91,25 @@ class PyDevdMessages(object):
text += ''
return urllib.quote(text)
+ def format_exception(self, threadid, exc, frame):
+ frameid, _, _, _ = frame
+ name = pydevd_xml.make_valid_xml_value(type(exc).__name__)
+ description = pydevd_xml.make_valid_xml_value(str(exc))
+
+ info = ''
+ info += ''.format(threadid)
+ info += ''
+ return '{}\t{}\t{}\t{}'.format(
+ frameid,
+ name or 'exception: type unknown',
+ description or 'exception: no description',
+ self.format_frames(
+ threadid,
+ CMD_SEND_CURR_EXCEPTION_TRACE,
+ frame,
+ ),
+ )
+
class VSCMessages(object):
@@ -403,10 +423,11 @@ class HighlevelFixture(object):
return allthreads
def suspend(self, thread, reason, *stack):
+ ptid, _ = thread
with self.wait_for_event('stopped'):
self.send_debugger_event(
CMD_THREAD_SUSPEND,
- self.debugger_msgs.format_frames(thread, reason, *stack),
+ self.debugger_msgs.format_frames(ptid, reason, *stack),
)
def pause(self, thread, *stack):
@@ -416,6 +437,15 @@ class HighlevelFixture(object):
self.send_request('scopes', {'frameId': 1})
return tid
+ def error(self, thread, exc, frame):
+ tid = self.set_thread(thread)
+ self.send_debugger_event(
+ CMD_SEND_CURR_EXCEPTION_TRACE,
+ self.debugger_msgs.format_exception(thread[0], exc, frame),
+ )
+ self.suspend(thread, CMD_STEP_CAUGHT_EXCEPTION, frame)
+ return tid
+
#def set_variables(self, ...):
# ...