From bd9c8a84b91183fb2a075fb2f2298d2b8516a128 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 18 Dec 2022 22:20:55 +0000 Subject: [PATCH] Implement stackprinter --- app/log.py | 44 ++++++++++++++++++++++++++------------------ app/musicmuster.py | 14 +++++++++++--- app/playlists.py | 5 ++++- poetry.lock | 11 ++++++++++- pyproject.toml | 1 + 5 files changed, 52 insertions(+), 23 deletions(-) diff --git a/app/log.py b/app/log.py index bbb607c..338ff8d 100644 --- a/app/log.py +++ b/app/log.py @@ -2,6 +2,7 @@ import logging import logging.handlers +import stackprinter import sys import traceback @@ -55,25 +56,32 @@ stderr.addFilter(local_filter) stderr.addFilter(debug_filter) # create formatter and add it to the handlers -stderr_fmt = logging.Formatter('[%(asctime)s] %(leveltag)s: %(message)s', - datefmt='%H:%M:%S') -syslog_fmt = logging.Formatter( - '[%(name)s] %(module)s.%(funcName)s - %(leveltag)s: %(message)s' -) -stderr.setFormatter(stderr_fmt) -syslog.setFormatter(syslog_fmt) +# stderr_fmt = logging.Formatter('[%(asctime)s] %(leveltag)s: %(message)s', +# datefmt='%H:%M:%S') +# syslog_fmt = logging.Formatter( +# '[%(name)s] %(module)s.%(funcName)s - %(leveltag)s: %(message)s' +# ) +# stderr.setFormatter(stderr_fmt) +# syslog.setFormatter(syslog_fmt) + + +class VerboseExceptionFormatter(logging.Formatter): + def formatException(self, exc_info): + msg = stackprinter.format(exc_info) + lines = msg.split('\n') + lines_indented = [" ┆ " + line + "\n" for line in lines] + msg_indented = "".join(lines_indented) + return msg_indented + + +stderr_fmt = '[%(asctime)s] %(leveltag)s: %(message)s' +stderr_formatter = VerboseExceptionFormatter(stderr_fmt, datefmt='%H:%M:%S') +stderr.setFormatter(stderr_formatter) + +syslog_fmt = '[%(name)s] %(module)s.%(funcName)s - %(leveltag)s: %(message)s' +syslog_formatter = VerboseExceptionFormatter(syslog_fmt) +syslog.setFormatter(syslog_formatter) # add the handlers to the log log.addHandler(stderr) log.addHandler(syslog) - - -def log_uncaught_exceptions(ex_cls, ex, tb): - - print("\033[1;31;47m") - logging.critical(''.join(traceback.format_tb(tb))) - print("\033[1;37;40m") - logging.critical('{0}: {1}'.format(ex_cls, ex)) - - -sys.excepthook = log_uncaught_exceptions diff --git a/app/musicmuster.py b/app/musicmuster.py index 33c1596..1004749 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -2,6 +2,7 @@ from log import log import argparse +import stackprinter import subprocess import sys import threading @@ -1557,6 +1558,13 @@ if __name__ == "__main__": win = Window() win.show() sys.exit(app.exec()) - except Exception: - msg = "Unhandled Exception caught by musicmuster.main()" - log.exception(msg, exc_info=True, stack_info=True) + except Exception as exc: + from helpers import send_mail + + msg = stackprinter.format(exc) + send_mail(Config.ERRORS_TO, Config.ERRORS_FROM, + "Exception from musicmuster", msg) + + print("\033[1;31;47mUnhandled exception starts\033[1;37;40m") + stackprinter.show(style="darkbg2") + print("\033[1;31;47mUnhandled exception ends\033[1;37;40m") diff --git a/app/playlists.py b/app/playlists.py index fc719d9..5c85273 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -1,4 +1,5 @@ import re +import stackprinter import subprocess import threading @@ -1954,8 +1955,10 @@ class PlaylistTab(QTableWidget): # FIXME temporary workaround to issue #147 try: self.item(playlist_row.row_number, column).setText(new_text) - except AttributeError: + except AttributeError as exc: msg = f"Issue 147 occurred. {playlist_row=}, {additional_text=}" + msg += "\n\n" + msg += stackprinter.format(exc) helpers.send_mail(Config.ERRORS_TO, Confit.ERRORS_FROM, "Issue #147 from musicmuster", msg) diff --git a/poetry.lock b/poetry.lock index b816256..b29dfe2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -624,6 +624,14 @@ pure-eval = "*" [package.extras] tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] +[[package]] +name = "stackprinter" +version = "0.2.10" +description = "Debug-friendly stack traces, with variable values and semantic highlighting" +category = "main" +optional = false +python-versions = ">=3.4" + [[package]] name = "text-unidecode" version = "1.3" @@ -708,7 +716,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "91e055875df86707e1ce1544b1d29126265011d750897912daa37af3fe005498" +content-hash = "0fdda77377246e18b5e85459fa2c26173f14467f32e71c576b30fa0899ced8b0" [metadata.files] alembic = [ @@ -1073,6 +1081,7 @@ stack-data = [ {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, ] +stackprinter = [] text-unidecode = [] thefuzz = [] tinytag = [ diff --git a/pyproject.toml b/pyproject.toml index 1b3fdd0..a03b648 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ thefuzz = "^0.19.0" python-Levenshtein = "^0.12.2" pyfzf = "^0.3.1" pydymenu = "^0.5.2" +stackprinter = "^0.2.10" [tool.poetry.dev-dependencies] ipdb = "^0.13.9"