diff options
author | elie <elie> | 2011-12-24 07:04:06 +0000 |
---|---|---|
committer | elie <elie> | 2011-12-24 07:04:06 +0000 |
commit | 1ebfc197fadb22ef2bf556dafb173d0869931567 (patch) | |
tree | 15b47f05b38a5b93f5e242a8b09c87dce995fcaf | |
parent | dc5654a5d1f5f4c26795fa36ca73deb2168bbb33 (diff) | |
download | pysnmp-1ebfc197fadb22ef2bf556dafb173d0869931567.tar.gz |
preserve original traceback on py3
-rw-r--r-- | pysnmp/proto/mpmod/rfc3412.py | 12 | ||||
-rw-r--r-- | pysnmp/smi/instrum.py | 14 |
2 files changed, 17 insertions, 9 deletions
diff --git a/pysnmp/proto/mpmod/rfc3412.py b/pysnmp/proto/mpmod/rfc3412.py index cafa002..801fcbe 100644 --- a/pysnmp/proto/mpmod/rfc3412.py +++ b/pysnmp/proto/mpmod/rfc3412.py @@ -524,7 +524,7 @@ class SnmpV3MessageProcessingModel(AbstractMessageProcessingModel): ) debug.logger & debug.flagMP and debug.logger('prepareDataElements: SM succeeded') except error.StatusInformation: - statusInformation = sys.exc_info()[1] + statusInformation, origTraceback = sys.exc_info()[1:3] debug.logger & debug.flagMP and debug.logger('prepareDataElements: SM failed, statusInformation %s' % statusInformation) if 'errorIndication' in statusInformation: # 7.2.6a @@ -585,7 +585,15 @@ class SnmpV3MessageProcessingModel(AbstractMessageProcessingModel): debug.logger & debug.flagMP and debug.logger('prepareDataElements: error reported') # 7.2.6b - raise statusInformation + if sys.version_info[0] <= 2: + raise statusInformation + else: + try: + raise statusInformation.with_traceback(origTraceback) + finally: + # Break cycle between locals and traceback object + # (seems to be irrelevant on Py3 but just in case) + del origTraceback else: # Sniff for engineIDs k = (transportDomain, transportAddress) diff --git a/pysnmp/smi/instrum.py b/pysnmp/smi/instrum.py index c9cba39..f5f085a 100644 --- a/pysnmp/smi/instrum.py +++ b/pysnmp/smi/instrum.py @@ -179,7 +179,7 @@ class MibInstrumController: mibTree, = self.mibBuilder.importSymbols('SNMPv2-SMI', 'iso') outputNameVals = [] state, status = 'start', 'ok' - myErr = None + origExc = None while 1: k = (state, status) if k in fsmTable: @@ -210,8 +210,8 @@ class MibInstrumController: rval = f(tuple(name), val, idx, acInfo) except error.SmiError: debug.logger & debug.flagIns and debug.logger('flipFlopFsm: fun %s failed %s for %s=%r' % (f, sys.exc_info()[1], name, val)) - if myErr is None: # Take the first exception - myErr = sys.exc_info() + if origExc is None: # Take the first exception + origExc, origTraceback = sys.exc_info()[1:3] status = 'err' break else: @@ -219,16 +219,16 @@ class MibInstrumController: if rval is not None: outputNameVals.append((rval[0], rval[1])) idx = idx + 1 - if myErr: + if origExc: if sys.version_info[0] <= 2: - raise myErr[1] + raise origExc else: try: - raise myErr[1].with_traceback(myErr[2]) + raise origExc.with_traceback(origTraceback) finally: # Break cycle between locals and traceback object # (seems to be irrelevant on Py3 but just in case) - del myErr + del origTraceback return outputNameVals def readVars(self, vars, acInfo=(None, None)): |