def trace_unhandled_exceptions(self, frame, event, arg): # Note that we ignore the frame as this tracing method should only be put in topmost frames already. if event == 'exception' and arg is not None: from _pydevd_bundle.pydevd_breakpoints import stop_on_unhandled_exception py_db, t, additional_info = self._args[0:3] if arg is not None: exctype, value, tb = arg stop_on_unhandled_exception(py_db, t, additional_info, exctype, value, tb) # IFDEF CYTHON # return SafeCallWrapper(self.trace_unhandled_exceptions) # ELSE return self.trace_unhandled_exceptions
def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # print('trace_dispatch_and_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) if self._frame_trace_dispatch is not None: # This deals with raised exceptions self._frame_trace_dispatch = self._frame_trace_dispatch(frame, event, arg) if event == 'exception': self._last_exc_arg = arg self._raise_lines.add(frame.f_lineno) self._last_raise_line = frame.f_lineno elif event == 'return' and self._last_exc_arg is not None: # For unhandled exceptions we actually track the return when at the topmost level. try: py_db, t, additional_info = self._args[0:3] if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. if frame.f_lineno in self._raise_lines: stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: if self._try_except_info is None: self._try_except_info = collect_try_except_info(frame.f_code) if not self._try_except_info: # Consider the last exception as unhandled because there's no try..except in it. stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: # Now, consider only the try..except for the raise valid_try_except_infos = [] for try_except_info in self._try_except_info: if try_except_info.is_line_in_try_block(self._last_raise_line): valid_try_except_infos.append(try_except_info) if not valid_try_except_infos: stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: # Note: check all, not only the "valid" ones to cover the case # in "tests_python.test_tracing_on_top_level.raise_unhandled10" # where one try..except is inside the other with only a raise # and it's gotten in the except line. for try_except_info in self._try_except_info: if try_except_info.is_line_in_except_block(frame.f_lineno): if ( frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except ): # In a raise inside a try..except block or some except which doesn't # match the raised exception. stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) break else: break # exited during the except block (no exception raised) finally: # Remove reference to exception after handling it. self._last_exc_arg = None # IFDEF CYTHON # return SafeCallWrapper(self.trace_dispatch_and_unhandled_exceptions) # ELSE return self.trace_dispatch_and_unhandled_exceptions
def trace_unhandled_exceptions(self, frame, event, arg): # Note that we ignore the frame as this tracing method should only be put in topmost frames already. # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) if event == 'exception' and arg is not None: py_db, t, additional_info = self._args[0:3] if arg is not None: if not additional_info.suspended_at_unhandled: additional_info.suspended_at_unhandled = True stop_on_unhandled_exception(py_db, t, additional_info, arg) # IFDEF CYTHON # return SafeCallWrapper(self.trace_unhandled_exceptions) # ELSE return self.trace_unhandled_exceptions
def trace_unhandled_exceptions(self, frame, event, arg): # Note that we ignore the frame as this tracing method should only be put in topmost frames already. # print('trace_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) if event == 'exception' and arg is not None: py_db, t, additional_info = self._args[0:3] if arg is not None: if not additional_info.suspended_at_unhandled: additional_info.suspended_at_unhandled = True stop_on_unhandled_exception(py_db, t, additional_info, arg) # No need to reset frame.f_trace to keep the same trace function. # IFDEF CYTHON # return SafeCallWrapper(self.trace_unhandled_exceptions) # ELSE return self.trace_unhandled_exceptions
def trace_dispatch_and_unhandled_exceptions(self, frame, event, arg): # print('trace_dispatch_and_unhandled_exceptions', event, frame.f_code.co_name, frame.f_code.co_filename, frame.f_code.co_firstlineno) if self._frame_trace_dispatch is not None: self._frame_trace_dispatch = self._frame_trace_dispatch(frame, event, arg) if event == 'exception': self._last_exc_arg = arg self._raise_lines.add(frame.f_lineno) self._last_raise_line = frame.f_lineno elif event == 'return' and self._last_exc_arg is not None: # For unhandled exceptions we actually track the return when at the topmost level. try: py_db, t, additional_info = self._args[0:3] if not additional_info.suspended_at_unhandled: # Note: only check it here, don't set. if frame.f_lineno in self._raise_lines: stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: if self._try_except_info is None: self._try_except_info = collect_try_except_info(frame.f_code) if not self._try_except_info: # Consider the last exception as unhandled because there's no try..except in it. stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: # Now, consider only the try..except for the raise valid_try_except_infos = [] for try_except_info in self._try_except_info: if try_except_info.is_line_in_try_block(self._last_raise_line): valid_try_except_infos.append(try_except_info) if not valid_try_except_infos: stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) else: # Note: check all, not only the "valid" ones to cover the case # in "tests_python.test_tracing_on_top_level.raise_unhandled10" # where one try..except is inside the other with only a raise # and it's gotten in the except line. for try_except_info in self._try_except_info: if try_except_info.is_line_in_except_block(frame.f_lineno): if ( frame.f_lineno == try_except_info.except_line or frame.f_lineno in try_except_info.raise_lines_in_except ): # In a raise inside a try..except block or some except which doesn't # match the raised exception. stop_on_unhandled_exception(py_db, t, additional_info, self._last_exc_arg) break else: break # exited during the except block (no exception raised) finally: # Remove reference to exception after handling it. self._last_exc_arg = None # IFDEF CYTHON # ret = SafeCallWrapper(self.trace_dispatch_and_unhandled_exceptions) # ELSE ret = self.trace_dispatch_and_unhandled_exceptions # ENDIF # Need to reset (the call to _frame_trace_dispatch may have changed it). frame.f_trace = ret return ret