diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-07-06 22:55:18 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-07-06 22:55:18 +0200 |
commit | 14f84dc139317de4cfc02ff36c2ad799b060dbaf (patch) | |
tree | 5163e8e596302e570a2e39c62d7a9df0e1490e28 /raphodo/excepthook.py | |
parent | 18afe3e2ebdb10bbc542d79280344d9adf923d2f (diff) | |
parent | 083849161f075878e4175cd03cb7afa83d64e7f5 (diff) |
Updated version 0.9.0 from 'upstream/0.9.0'
with Debian dir 04f2bb3e026e2a983dcac5cdcc35c9dd8f6b91ab
Diffstat (limited to 'raphodo/excepthook.py')
-rw-r--r-- | raphodo/excepthook.py | 105 |
1 files changed, 105 insertions, 0 deletions
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 <damonlynch@gmail.com> + +# 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 <http://www.gnu.org/licenses/>. + +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"""<b>A problem occurred in Rapid Photo Downloader</b><br><br> + Please report the problem at <a href="{website}">{website}</a>.<br><br> + Attach the log file <i>{log_file}</i> to your bug report (click + <a href="{log_path}">here</a> to open the log directory).<br><br>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 + |