summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2011-12-24 07:04:06 +0000
committerelie <elie>2011-12-24 07:04:06 +0000
commit1ebfc197fadb22ef2bf556dafb173d0869931567 (patch)
tree15b47f05b38a5b93f5e242a8b09c87dce995fcaf
parentdc5654a5d1f5f4c26795fa36ca73deb2168bbb33 (diff)
downloadpysnmp-1ebfc197fadb22ef2bf556dafb173d0869931567.tar.gz
preserve original traceback on py3
-rw-r--r--pysnmp/proto/mpmod/rfc3412.py12
-rw-r--r--pysnmp/smi/instrum.py14
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)):