Source code for camelot.view.controls.exception

#  ============================================================================
#
#  Copyright (C) 2007-2013 Conceptive Engineering bvba. All rights reserved.
#  www.conceptive.be / info@conceptive.be
#
#  This file is part of the Camelot Library.
#
#  This file may be used under the terms of the GNU General Public
#  License version 2.0 as published by the Free Software Foundation
#  and appearing in the file license.txt included in the packaging of
#  this file.  Please review this information to ensure GNU
#  General Public Licensing requirements will be met.
#
#  If you are unsure which license is appropriate for your use, please
#  visit www.python-camelot.com or contact info@conceptive.be
#
#  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
#  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#  For use of this library in commercial applications, please contact
#  info@conceptive.be
#
#  ============================================================================

"""Functions and widget to represent exceptions to the user"""


from PyQt4 import QtGui

from camelot.core.utils import ugettext as _
from camelot.core.exception import UserException

[docs]def register_exception(logger, text, exception): """Log an exception and return a serialized form of the exception with exception information in a user readable format, to be used when displaying an exception message box. that serialized form can be fed to the model_thread_exception_message_box function. :return: a tuple with exception information """ if isinstance( exception, UserException ): # this exception is not supposed to generate any logging # or inform the developer about something return (exception.title, exception.text, exception.icon, exception.resolution, exception.detail) logger.error( text, exc_info = exception ) title = _('Exception') text = _('An unexpected event occurred') icon = None # chop the size of the text to prevent error dialogs larger than the screen resolution = unicode(exception)[:1000] import traceback, cStringIO sio = cStringIO.StringIO() traceback.print_exc(file=sio) detail = sio.getvalue() sio.close() return (title, text, icon, resolution, detail)
[docs]class ExceptionDialog(QtGui.QMessageBox): """Dialog to display an exception to the user .. image:: /_static/controls/user_exception.png """ def __init__( self, exception_info ): """Dialog to display a serialized exception, as returned by :func:`register_exception` :param exception_info: a tuple containing exception information """ (title, text, icon, resolution, detail) = exception_info super( ExceptionDialog, self ).__init__(QtGui.QMessageBox.Warning, unicode(title), unicode(text)) self.setInformativeText(unicode(resolution or '')) self.setDetailedText(unicode(detail or ''))
[docs]def model_thread_exception_message_box(exception_info): """Display an exception that occurred in the model thread in a message box, use this function as the exception argument in the model thread's post function to represent the exception to the user :param exception_info: a tuple containing exception information """ dialog = ExceptionDialog( exception_info ) dialog.exec_()