crash reporter: send traceback for full chain of exceptions
Previously if there was a chain of exceptions, we were only
sending the traceback for the final exception.
E.g.
try:
raise ExcOne("asdasd")
except ExcOne() as e:
raise ExcTwo("qweqwe") from e
^ we would lose all info about ExcOne, including potentially many lines of trace
This commit is contained in:
@@ -81,7 +81,7 @@ class BaseCrashReporter(Logger):
|
|||||||
def get_traceback_info(self):
|
def get_traceback_info(self):
|
||||||
exc_string = str(self.exc_args[1])
|
exc_string = str(self.exc_args[1])
|
||||||
stack = traceback.extract_tb(self.exc_args[2])
|
stack = traceback.extract_tb(self.exc_args[2])
|
||||||
readable_trace = "".join(traceback.format_list(stack))
|
readable_trace = self.__get_traceback_str_to_send()
|
||||||
id = {
|
id = {
|
||||||
"file": stack[-1].filename,
|
"file": stack[-1].filename,
|
||||||
"name": stack[-1].name,
|
"name": stack[-1].name,
|
||||||
@@ -109,12 +109,19 @@ class BaseCrashReporter(Logger):
|
|||||||
pass
|
pass
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def _get_traceback_str(self) -> str:
|
def __get_traceback_str_to_send(self) -> str:
|
||||||
|
# make sure that traceback sent to crash reporter contains
|
||||||
|
# e.__context__ and e.__cause__, i.e. if there was a chain of
|
||||||
|
# exceptions, we want the full traceback for the whole chain.
|
||||||
return "".join(traceback.format_exception(*self.exc_args))
|
return "".join(traceback.format_exception(*self.exc_args))
|
||||||
|
|
||||||
|
def _get_traceback_str_to_display(self) -> str:
|
||||||
|
# overridden in Qt subclass
|
||||||
|
return self.__get_traceback_str_to_send()
|
||||||
|
|
||||||
def get_report_string(self):
|
def get_report_string(self):
|
||||||
info = self.get_additional_info()
|
info = self.get_additional_info()
|
||||||
info["traceback"] = self._get_traceback_str()
|
info["traceback"] = self._get_traceback_str_to_display()
|
||||||
return self.issue_template.format(**info)
|
return self.issue_template.format(**info)
|
||||||
|
|
||||||
def get_user_description(self):
|
def get_user_description(self):
|
||||||
|
|||||||
@@ -145,11 +145,11 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin, Logger):
|
|||||||
wallet_types = Exception_Hook._INSTANCE.wallet_types_seen
|
wallet_types = Exception_Hook._INSTANCE.wallet_types_seen
|
||||||
return ",".join(wallet_types)
|
return ",".join(wallet_types)
|
||||||
|
|
||||||
def _get_traceback_str(self) -> str:
|
def _get_traceback_str_to_display(self) -> str:
|
||||||
# The msg_box that shows the report uses rich_text=True, so
|
# The msg_box that shows the report uses rich_text=True, so
|
||||||
# if traceback contains special HTML characters, e.g. '<',
|
# if traceback contains special HTML characters, e.g. '<',
|
||||||
# they need to be escaped to avoid formatting issues.
|
# they need to be escaped to avoid formatting issues.
|
||||||
traceback_str = super()._get_traceback_str()
|
traceback_str = super()._get_traceback_str_to_display()
|
||||||
return html.escape(traceback_str)
|
return html.escape(traceback_str)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user