12345678910111213141516171819202122232425262728293031323334353637 |
- # -*- coding: utf-8 -*-
- import threading
- def pytest_exception_interact(node, call, report):
- """
- Drop into PyCharm debugger, if available, on uncaught exceptions.
- """
- try:
- import pydevd
- from pydevd import pydevd_tracing
- except ImportError:
- pass
- else:
- exctype, value, traceback = call.excinfo._excinfo
- frames = []
- while traceback:
- frames.append(traceback.tb_frame)
- traceback = traceback.tb_next
- thread = threading.current_thread()
- frames_by_id = dict([(id(frame), frame) for frame in frames])
- frame = frames[-1]
- exception = (exctype, value, traceback)
- if hasattr(thread, "additional_info"):
- thread.additional_info.pydev_message = "test fail"
- try:
- debugger = pydevd.debugger
- except AttributeError:
- debugger = pydevd.get_global_debugger()
- pydevd_tracing.SetTrace(None) # no tracing from here
- try:
- debugger.stop_on_unhandled_exception(thread, frame, frames_by_id, exception)
- except AttributeError:
- # fallback to pre PyCharm 2019.2 API
- debugger.handle_post_mortem_stop(thread, frame, frames_by_id, exception)
- return report
|