commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r9803 - in trunk/gnue-common/src: apps base datasources/drivers/o


From: johannes
Subject: [gnue] r9803 - in trunk/gnue-common/src: apps base datasources/drivers/other rpc
Date: Wed, 14 Nov 2007 08:16:55 -0600 (CST)

Author: johannes
Date: 2007-11-14 08:16:55 -0600 (Wed, 14 Nov 2007)
New Revision: 9803

Added:
   trunk/gnue-common/src/base/errors.py
Modified:
   trunk/gnue-common/src/apps/errors.py
   trunk/gnue-common/src/datasources/drivers/other/appserver.py
   trunk/gnue-common/src/rpc/client.py
Log:
Moved implementation from common.apps.errors into common.base.errors,
more PEP8-ification


Modified: trunk/gnue-common/src/apps/errors.py
===================================================================
--- trunk/gnue-common/src/apps/errors.py        2007-11-14 09:57:51 UTC (rev 
9802)
+++ trunk/gnue-common/src/apps/errors.py        2007-11-14 14:16:55 UTC (rev 
9803)
@@ -23,6 +23,8 @@
 
 """
 General exception classes.
+
+This module is *DEPRECATED*. Please use gnue.common.base.i18n instead
 """
 
 import sys
@@ -32,13 +34,18 @@
 import exceptions
 
 from gnue.common.base import i18n
+from gnue.common.base import errors
 
+from gnue.common.base.errors import SystemError, AdminError, ApplicationError
+from gnue.common.base.errors import UserError, RemoteError
+
+
 # =============================================================================
 # New basic exception class. Python's standard exception class cannot handle
 # unicode messages.
 # =============================================================================
 
-class gException(Exception):
+class gException(errors.Error):
     """
     The same as the builtin python Exception, but can handle messages that are
     unicode strings.  This exception is available as the builtin class
@@ -55,11 +62,7 @@
       returned by L{getDetail} and L{getException} instead of the traceback.
     """
     def __init__(self, message, group='system'):
-        self.message = message
-        self.group   = group
-        self.name    = None
-        self.detail  = None
-        exceptions.Exception.__init__(self, o(message))
+        errors.Error.__init__(self, message)
 
 
     # -------------------------------------------------------------------------
@@ -88,8 +91,7 @@
         @return: Name of the exception.
         @rtype: Unicode
         """
-        rep = self.name or "%s" % (sys.exc_info()[0] or aType)
-        return self._fmtUnicode(rep.split('.')[-1])
+        return self.get_name(aType)
 
 
     # -------------------------------------------------------------------------
@@ -108,20 +110,9 @@
         @return: Detail information for the exception.
         @rtype: Unicode
         """
-        if self.detail is not None:
-            return self._fmtUnicode(self.detail, i18n.get_encoding())
+        return self.get_detail(count, type, value, trace)
 
-        if sys.exc_info() == (None, None, None):
-            tStack = traceback.format_exception(type, value, trace)
-        else:
-            tStack = traceback.format_exception(*sys.exc_info())
 
-        if count is not None:
-            del tStack[1:count + 1]
-
-        return self._fmtUnicode("%s" % string.join(tStack), 
i18n.get_encoding())
-
-
     # -------------------------------------------------------------------------
     # Get the message of an exception
     # -------------------------------------------------------------------------
@@ -132,105 +123,9 @@
         @return: Message of the exception.
         @rtype: Unicode
         """
-        return self._fmtUnicode(self.message)
+        return self.message
 
 
-    # -------------------------------------------------------------------------
-    # Make sure a given text is a unicode string
-    # -------------------------------------------------------------------------
-
-    def _fmtUnicode(self, text, encoding=None):
-        """
-        Return a given text as unicode string using an optional encoding or the
-        system's default encoding.
-
-        @param text: String to be encoded. If this string is already unicode no
-          modification will take place.
-        @param encoding: Encoding to use (if None, system default encoding will
-          take place)
-        @return: Unicode representation of the text parameter.
-        """
-        if isinstance(text, types.UnicodeType):
-            return text
-        else:
-            if encoding is not None:
-                return unicode(text, encoding, 'replace')
-            else:
-                return unicode(text, errors='replace')
-
-
-# =============================================================================
-# System Error
-# =============================================================================
-
-class SystemError(gException):
-    """
-    This exception class should be used for exceptions indicating a bug in
-    GNUe.  Whenever such an exception is raised, one have found such a bug :)
-    """
-    def __init__(self, message):
-        gException.__init__(self, message, 'system')
-
-
-# =============================================================================
-# Administrative Errors
-# =============================================================================
-
-class AdminError(gException):
-    """
-    This exception class should be used for exceptions indicating a
-    misconfiguration in a widest sense. This could be a missing module for a
-    dbdriver as well as an 'out of disk space' error.
-    """
-    def __init__(self, message):
-        gException.__init__(self, message, 'admin')
-
-
-# =============================================================================
-# Application Errors
-# =============================================================================
-
-class ApplicationError(gException):
-    """
-    This class should be used for errors caused by applications like a corrupt
-    trigger code, or a misformed xml-file and so on.
-    """
-    def __init__(self, message):
-        gException.__init__(self, message, 'application')
-
-
-# =============================================================================
-# User Errors
-# =============================================================================
-
-class UserError(gException):
-    """
-    This class should be used for exceptions where a user did something wrong,
-    or a situation has occured which isn't dramatic, but the user has to be
-    informed of. Example: wrong password or the user has entered non-numeric
-    data into a numeric field, and so on.
-    """
-    def __init__(self, message):
-        gException.__init__(self, message, 'user')
-
-
-# =============================================================================
-# Exceptions raised on a remote site/process
-# =============================================================================
-
-class RemoteError(gException):
-    """
-    This class is used for transporting an exception raised at a remote point.
-    Once it has been created it never changes it's contents. A remote error
-    usually contains System-, Admin- or User-Errors.
-    """
-    def __init__(self, group, name, message, detail):
-        gException.__init__(self, message)
-        self.group  = group
-        self.name   = name
-        self.detail = detail
-
-
 # -----------------------------------------------------------------------------
 # Get a tuple (type, name, message, detail) for the last exception raised
 # -----------------------------------------------------------------------------
@@ -249,25 +144,4 @@
     @param count: number of lines to skip in the traceback
     @return: tuple with group, name, message and detail of the last exception.
     """
-    (sType, sValue, sTrace) = sys.exc_info()
-    aType  = aType  or sType
-    aValue = aValue or sValue
-    aTrace = aTrace or sTrace
-
-    if isinstance(aValue, gException):
-        return (aValue.getGroup(), aValue.getName(aType), aValue.getMessage(),
-                aValue.getDetail(count, aType, aValue, aTrace))
-    else:
-        # Exception was not a descendant of gException, so we construct the
-        # tuple from the exception information
-        lines = traceback.format_exception(aType, aValue, aTrace)
-        if count is not None:
-            del lines[1:count + 1]
-
-        name = unicode("%s" % aType, i18n.get_encoding(), 'replace')
-        name = name.split('.')[-1]
-        message = unicode("%s" % aValue, i18n.get_encoding(), 'replace')
-        detail  = string.join(lines)
-        if isinstance(detail, types.StringType):
-            detail = unicode(detail, i18n.get_encoding(), 'replace')
-        return ('system', name, message, detail)
+    return errors.get_exception(count, aType, aValue, aTrace)

Added: trunk/gnue-common/src/base/errors.py
===================================================================
--- trunk/gnue-common/src/base/errors.py        2007-11-14 09:57:51 UTC (rev 
9802)
+++ trunk/gnue-common/src/base/errors.py        2007-11-14 14:16:55 UTC (rev 
9803)
@@ -0,0 +1,253 @@
+# GNU Enterprise Common Library - Base exception classes
+#
+# Copyright 2001-2007 Free Software Foundation
+#
+# This file is part of GNU Enterprise
+#
+# GNU Enterprise 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 2, or (at your option) any later version.
+#
+# GNU Enterprise 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 program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+"""
+General exception classes.
+"""
+
+import sys
+import traceback
+import exceptions
+
+from gnue.common.base import i18n
+
+__all__ = ['get_exception', 'SystemError', 'AdminError', 'ApplicationError',
+           'UserError', 'RemoteError']
+
+
+# =============================================================================
+# Base exception class for all GNUe Exceptions
+# =============================================================================
+
+class Error(exceptions.Exception):
+    """
+    The same as the builtin python Exception, but can handle messages that are
+    unicode strings.  All other user-defined exceptions should be derived from
+    this class.
+
+    @ivar message: The error message.
+    @type message: Unicode
+    @ivar group: The group or category of the exception. Can be one of 
'system',
+        'admin', 'application', or 'user'.
+    @ivar name: The name of the exception. If set, this will be returned by
+        L{get_name} and L{get_exception} instead of the class name of the
+        exception.
+    @ivar detail: The detail information to the exception. If set, this will be
+        returned by L{get_detail} and L{get_exception} instead of the
+        traceback.
+    """
+    def __init__(self, message, group='system'):
+
+        self.message = message
+        self.group   = group
+        self.name    = None
+        self.detail  = None
+
+        exceptions.Exception.__init__(self, o(message))
+
+
+    # -------------------------------------------------------------------------
+    # Return the name of the exception
+    # -------------------------------------------------------------------------
+
+    def get_name(self, exc_type=None):
+        """
+        Return the exception's name, which is the classname of the exception
+        class unless overwritten with L{name}.
+
+        @param exc_type: Type of the exception class to be used if no name is
+            defined and the exception being handled is no longer available in
+            sys.exc_info()
+
+        @return: Name of the exception.
+        @rtype: Unicode
+        """
+        rep = self.name or "%s" % (sys.exc_info()[0] or exc_type)
+        return to_unicode(rep.split('.')[-1])
+
+
+    # -------------------------------------------------------------------------
+    # Get the detail of an exception
+    # -------------------------------------------------------------------------
+
+    def get_detail(self, count=None, etype=None, evalue=None, etrace=None):
+        """
+        Return the exception's detail, which is the traceback unless
+        overwritten with L{detail}.
+
+        Optionally, a number of lines can be skipped at the beginning of the
+        traceback (if the detail I{is} the traceback).
+
+        @param count: Number of lines to skip at the beginning of the 
traceback.
+        @return: Detail information for the exception.
+        @rtype: Unicode
+        """
+        if self.detail is not None:
+            return to_unicode(self.detail, i18n.get_encoding())
+
+        (stype, svalue, strace) = sys.exc_info()
+        stype  = stype or etype
+        svalue = svalue or evalue
+        strace = strace or etrace
+
+        tStack = traceback.format_exception(stype, svalue, strace)
+        if count is not None:
+            del tStack[1:count + 1]
+
+        return to_unicode("%s" % ''.join(tStack), i18n.get_encoding())
+
+
+
+# =============================================================================
+# System Error
+# =============================================================================
+
+class SystemError(Error):
+    """
+    This exception class should be used for exceptions indicating a bug in
+    GNUe.  Whenever such an exception is raised, one have found such a bug :)
+    """
+    def __init__(self, message):
+        Error.__init__(self, message, 'system')
+
+
+# =============================================================================
+# Administrative Errors
+# =============================================================================
+
+class AdminError(Error):
+    """
+    This exception class should be used for exceptions indicating a
+    misconfiguration in a widest sense. This could be a missing module for a
+    dbdriver as well as an 'out of disk space' error.
+    """
+    def __init__(self, message):
+        Error.__init__(self, message, 'admin')
+
+
+# =============================================================================
+# Application Errors
+# =============================================================================
+
+class ApplicationError(Error):
+    """
+    This class should be used for errors caused by applications like a corrupt
+    trigger code, or a misformed xml-file and so on.
+    """
+    def __init__(self, message):
+        Error.__init__(self, message, 'application')
+
+
+# =============================================================================
+# User Errors
+# =============================================================================
+
+class UserError(Error):
+    """
+    This class should be used for exceptions where a user did something wrong,
+    or a situation has occured which isn't dramatic, but the user has to be
+    informed of. Example: wrong password or the user has entered non-numeric
+    data into a numeric field, and so on.
+    """
+    def __init__(self, message):
+        Error.__init__(self, message, 'user')
+
+
+# =============================================================================
+# Exceptions raised on a remote site/process
+# =============================================================================
+
+class RemoteError(Error):
+    """
+    This class is used for transporting an exception raised at a remote point.
+    Once it has been created it never changes it's contents. A remote error
+    usually contains System-, Admin- or User-Errors.
+    """
+    def __init__(self, group, name, message, detail):
+        Error.__init__(self, message)
+        self.group  = group
+        self.name   = name
+        self.detail = detail
+
+
+# -----------------------------------------------------------------------------
+# Get a tuple (type, name, message, detail) for the last exception raised
+# -----------------------------------------------------------------------------
+
+def get_exception(count=None, exc_type=None, exc_value=None, exc_tback=None):
+    """
+    Return textual information about an exception.
+
+    This function creates a tuple (group, name, message, detail) for the last
+    exception raised. The optional parameter determines the number of lines
+    skipped from the detail traceback.
+
+    The intended use of this function is to get the text to be displayed in
+    error messages.
+
+    @param count: number of lines to skip in the traceback
+    @return: tuple with group, name, message and detail of the last exception.
+    """
+    (sType, sValue, sTrace) = sys.exc_info()
+
+    exc_type  = exc_type  or sType
+    exc_value = exc_value or sValue
+    exc_tback = exc_tback or sTrace
+
+    if isinstance(exc_value, Error):
+        return (exc_value.group,
+                exc_value.get_name(exc_type),
+                exc_value.message,
+                exc_value.get_detail(count, exc_type, exc_value, exc_tback))
+    else:
+        # Exception was not a descendant of Error, so we construct the
+        # tuple from the exception information
+        lines = traceback.format_exception(exc_type, exc_value, exc_tback)
+        if count is not None:
+            del lines[1:count + 1]
+
+        name = unicode("%s" % exc_type, i18n.get_encoding(), 'replace')
+        name = name.split('.')[-1]
+        message = unicode("%s" % exc_value, i18n.get_encoding(), 'replace')
+        detail  = ''.join(lines)
+        if isinstance(detail, str):
+            detail = unicode(detail, i18n.get_encoding(), 'replace')
+
+        return ('system', name, message, detail)
+
+
+# -----------------------------------------------------------------------------
+# Create a unicode string using a given encoding
+# -----------------------------------------------------------------------------
+
+def to_unicode(text, encoding=None):
+
+    result = text
+
+    if isinstance(text, str):
+        if encoding is not None:
+            result = unicode(text, encoding, 'replace')
+        else:
+            result = unicode(text, errors='replace')
+
+    return result


Property changes on: trunk/gnue-common/src/base/errors.py
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: trunk/gnue-common/src/datasources/drivers/other/appserver.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/other/appserver.py        
2007-11-14 09:57:51 UTC (rev 9802)
+++ trunk/gnue-common/src/datasources/drivers/other/appserver.py        
2007-11-14 14:16:55 UTC (rev 9803)
@@ -385,8 +385,8 @@
       self._session = self._sm.open (connectData)
 
     except errors.RemoteError, e:
-      if e.getName () == 'AuthError':
-        raise Exceptions.LoginError, e.getMessage ()
+      if e.get_name() == 'AuthError':
+        raise Exceptions.LoginError, e.message
       else:
         raise
 

Modified: trunk/gnue-common/src/rpc/client.py
===================================================================
--- trunk/gnue-common/src/rpc/client.py 2007-11-14 09:57:51 UTC (rev 9802)
+++ trunk/gnue-common/src/rpc/client.py 2007-11-14 14:16:55 UTC (rev 9803)
@@ -163,22 +163,16 @@
 
   except Exception, e:
     print "-" * 70
-    if isinstance (e, errors.gException):
-      print "Exception Group:", e.getGroup ()
-      print "Exception Name :", e.getName ()
-      print "Message        :", e.getMessage ()
-    else:
-      print "Exception:", e
+    (group, name, message, detail) = errors.getException()
+    print "Exception Group:", group
+    print "Exception Name :", name
+    print "Message        :", message
+    print "Detail         :", detail
 
     print "-" * 70
     print "local traceback:"
     traceback.print_exc ()
 
-    if isinstance (e, errors.gException):
-      print "-" * 70
-      print "remote exception detail:", e.getDetail ()
-      print "-" * 70
-
   print "-" * 70
   o = None
   print "Sending %r (%s) to a roundtrip ..." % (o, type (o))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]