commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r9766 - in trunk/gnue-common/src: apps base


From: reinhard
Subject: [gnue] r9766 - in trunk/gnue-common/src: apps base
Date: Tue, 24 Jul 2007 17:26:46 -0500 (CDT)

Author: reinhard
Date: 2007-07-24 17:26:45 -0500 (Tue, 24 Jul 2007)
New Revision: 9766

Modified:
   trunk/gnue-common/src/apps/GBaseApp.py
   trunk/gnue-common/src/base/log.py
Log:
Added exception hook.

issue123 in-progress


Modified: trunk/gnue-common/src/apps/GBaseApp.py
===================================================================
--- trunk/gnue-common/src/apps/GBaseApp.py      2007-07-24 20:56:18 UTC (rev 
9765)
+++ trunk/gnue-common/src/apps/GBaseApp.py      2007-07-24 22:26:45 UTC (rev 
9766)
@@ -39,6 +39,7 @@
 
 from gnue import paths
 
+from gnue.common.base import log
 from gnue.common.apps import i18n, errors, GConfig, GDebug
 from gnue.common.datasources import GConnections
 from gnue.common.apps.CommandOption import CommandOption
@@ -759,6 +760,7 @@
     overriden by a descendant.
     """
     sys.excepthook = sys.__excepthook__
+    log.excepthook(etype, value, traceback)
     self._showException (*errors.getException (None, etype, value, traceback))
     sys.excepthook = self.excepthook
 

Modified: trunk/gnue-common/src/base/log.py
===================================================================
--- trunk/gnue-common/src/base/log.py   2007-07-24 20:56:18 UTC (rev 9765)
+++ trunk/gnue-common/src/base/log.py   2007-07-24 22:26:45 UTC (rev 9766)
@@ -32,6 +32,8 @@
 import inspect
 import logging
 import logging.config
+import sys
+import traceback
 
 from gnue.common.base import utils
 
@@ -43,7 +45,6 @@
         'critical_n', 'exception_n']
 
 # TODO:
-# - Exception hook
 # - allow for __gnue_logger__ module global variable to use as a logger name
 #   instead of the module name (make a function in utils.py to search and cache
 #   module global variables in the module hierarchy)
@@ -292,6 +293,31 @@
 
 
 # -----------------------------------------------------------------------------
+# Exception hooks
+# -----------------------------------------------------------------------------
+
+def excepthook(etype, evalue, etraceback):
+    """
+    Exception hook to log an exception to the "exception" logger family.
+
+    @param etype: Exception class
+    @type etype: class
+    @param evalue: Exception instance
+    @type evalue: instance
+    @param etraceback: Exception traceback
+    @type etraceback: traceback
+    """
+    # TODO: log to exception.system, exception.admin, or exception.application,
+    # depending on the exception group of gException.
+    # TODO: use getException to receive exception details instead of formatting
+    # the exception here. Could be implemented by overwriting
+    # Formatter.formatException().
+    # TODO: use a separate logger per exception class, like
+    # 
exception.admin.gnue.common.datasources.GDataSource.ResourceNotFoundError?
+    error_n('exception', "Unhandled exception occured",
+            exc_info=(etype, evalue, etraceback))
+
+# -----------------------------------------------------------------------------
 # Log to the logger named after the calling module
 # -----------------------------------------------------------------------------
 
@@ -378,6 +404,9 @@
     """
     Log an exception to the logger named after the calling module.
 
+    This function can be used in a try...except block to log an exception
+    before it is discarded.
+
     @param msg: Message to log.
     @type msg: string or unicode
     @return: always True, so the call can be prefixed with assert.
@@ -497,6 +526,9 @@
     """
     Log an exception to the logger defined through the C{name} parameter.
 
+    This function can be used in a try...except block to log an exception
+    before it is discarded.
+
     @param name: Logger name to log to.
     @type name: string
     @param msg: Message to log.
@@ -533,7 +565,22 @@
             frame = frame.f_back
         return ("(unknown file)", 0, "(unknown function)")
 
+    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, *vargs):
+        """
+        Create the LogRecord.
 
+        In case of an exception, the filename, line number and function name of
+        the code line causing the exception is substituted.
+        """
+        if exc_info is not None:
+            (fn, lno, func, text) = traceback.extract_tb(exc_info[2])[-1]
+            # This parameter only exists with Python 2.5+
+            if vargs:
+                vargs[0] = func
+        return logging.Logger.makeRecord(self, name, level, fn, lno, msg, args,
+                exc_info, *vargs)
+
+
 # -----------------------------------------------------------------------------
 # Module initialization
 # -----------------------------------------------------------------------------
@@ -551,3 +598,6 @@
     logging.config.fileConfig(_CONFIG_FILES)
 else:
     logging.basicConfig()
+
+# Use our exception hook
+sys.excepthook = excepthook





reply via email to

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