From 083849161f075878e4175cd03cb7afa83d64e7f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Thu, 6 Jul 2017 22:55:08 +0200 Subject: New upstream version 0.9.0 --- raphodo/excepthook.py | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 raphodo/excepthook.py (limited to 'raphodo/excepthook.py') diff --git a/raphodo/excepthook.py b/raphodo/excepthook.py new file mode 100644 index 0000000..8c75839 --- /dev/null +++ b/raphodo/excepthook.py @@ -0,0 +1,105 @@ +# Copyright (C) 2016 Damon Lynch + +# This file is part of Rapid Photo Downloader. +# +# Rapid Photo Downloader is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Rapid Photo Downloader is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Rapid Photo Downloader. If not, +# see . + +import logging +import traceback +import io +import os +from urllib.request import pathname2url +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QMessageBox, QApplication +from PyQt5.QtGui import QPixmap +try: + from easygui import codebox + have_easygui = True +except: + # if import failed for any reason, ignore it + have_easygui = False + +from gettext import gettext as _ +import raphodo.qrc_resources as qrc_resources + +from raphodo.iplogging import full_log_file_path + +message_box_displayed = False +exceptions_notified = set() + + +def excepthook(exception_type, exception_value, traceback_object) -> None: + """ + Global function to catch unhandled exceptions. + + Inspired by function of the same name in the Eric project. + """ + + if traceback_object is not None: + frame = traceback_object.tb_frame + filename = frame.f_code.co_filename + lineno = traceback_object.tb_lineno + else: + lineno = -1 + filename = 'unknown' + key = '{}{}'.format(filename, lineno) + + global message_box_displayed + + tb_file = io.StringIO() + traceback.print_exception(exception_type, exception_value, traceback_object, + limit=None, file=tb_file) + tb_file.seek(0) + traceback_info = tb_file.read() + + logging.error("An unhandled exception occurred") + logging.error(traceback_info) + + if not message_box_displayed and key not in exceptions_notified: + message_box_displayed = True + exceptions_notified.add(key) + + log_path, log_file = os.path.split(full_log_file_path()) + log_uri = pathname2url(log_path) + + title = _("Problem in Rapid Photo Downloader") + + if QApplication.instance(): + + message = _(r"""A problem occurred in Rapid Photo Downloader

+ Please report the problem at {website}.

+ Attach the log file {log_file} to your bug report (click + here to open the log directory).

If the same problem occurs + again before the program exits, this is the only notification about it. + """).format(website='https://bugs.launchpad.net/rapid', log_path=log_uri, log_file=log_file) + + icon = QPixmap(':/rapid-photo-downloader.svg') + + errorbox = QMessageBox() + errorbox.setTextFormat(Qt.RichText) + errorbox.setIconPixmap(icon) + errorbox.setWindowTitle(title) + errorbox.setText(message) + errorbox.setDetailedText(traceback_info) + errorbox.exec_() + elif have_easygui: + message = _('A problem occurred in Rapid Photo Downloader\n') + prefix = _("""Please report the problem at {website}\n + Attach the log file to your bug report, found at {log_path}\n\n""").format( + website='https://bugs.launchpad.net/rapid', log_path=full_log_file_path()) + text = prefix + traceback_info + codebox(msg=message, title=title, text=text) + message_box_displayed = False + -- cgit v1.2.3