summaryrefslogtreecommitdiff
path: root/raphodo/excepthook.py
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2017-07-06 22:55:18 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2017-07-06 22:55:18 +0200
commit14f84dc139317de4cfc02ff36c2ad799b060dbaf (patch)
tree5163e8e596302e570a2e39c62d7a9df0e1490e28 /raphodo/excepthook.py
parent18afe3e2ebdb10bbc542d79280344d9adf923d2f (diff)
parent083849161f075878e4175cd03cb7afa83d64e7f5 (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.py105
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
+