Python2.7异常元组索引

2024-09-30 01:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从异常元组中获取错误代码。在Python2.4中,下面的代码可以工作,但在Python2.7中不行。似乎运行python2.7时的exceptionTuple无法被索引?有什么想法吗?在

import traceback
import sys
import types

class CRaiseException(Exception):
   '''info'''
   args = []
   def __init__(self, exceptionTuple):

      print "__init__"
      self.failureData = exceptionTuple
      self.args = self.failureData      # Becomes excptionData.args


   def __str__(self):
      print "__str__"
      return str(self.failureData)

   def __args__(self):
      print "__args__"
      return tuple(self.failureData)


def raiseException(code, msg='', exceptionType = CRaiseException):
   failureData = (('Fail message', 0, 11044, 0), 22.0, (0.005, 0.001))
   raise exceptionType(failureData)


if __name__ == '__main__':

   try:
      print sys.version
      raiseException(12345, 'skip TrackCleanup and raise to do serial format.')

   except CRaiseException, exceptionData:
      try:
         failureData = exceptionData
         print "failureData = %s" %str(failureData)

         failCode = failureData[0][2]

         print "failCode = %s" %str(failCode)
         print "Tuple exceptionData -- PASS"

      except:
         print "Non-tuple exceptioData -- FAIL"
         print "Traceback %s" %traceback.format_exc()

Python 2.4结果:

^{pr2}$

Python 2.7结果:

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
__init__
__str__
failureData = (('Fail message', 0, 11044, 0), 22.0, (0.005, 0.001))
Non-tuple exceptioData -- FAIL
Traceback Traceback (most recent call last):
  File "D:\Python\raiseException.py", line 51, in <module>
    failCode = failureData[0][2]                 # Works in Python 2.4 but not in Python 2.7
IndexError: tuple index out of range

Tags: importselfinitdefargsprinttracebackstr
1条回答
网友
1楼 · 发布于 2024-09-30 01:37:31

我不熟悉Python2.4,但我尝试过在Python2.7.5中使用您的代码。在

如果您print type(failureData)在哪里捕捉到异常,它将告诉您:

<class '__main__.CRaiseException'>

这显然意味着failureData是一个类而不是一个元组,因此不能用[0][2]对其进行索引。在

只需更改:

^{pr2}$

failCode = failureData.failureData[0][2]

这个变化给了我这样的结果:

2.7.5 (default, Sep 12 2013, 21:33:34) 
__init__
__str__
failureData = (('Fail message', 0, 11044, 0), 22.0, (0.005, 0.001))
failCode = 11044
Tuple exceptionData   PASS

Python和Python是一样的。在

希望有帮助。在

编辑:

构造代码的更好方法是避免在类和main中使用相同的变量名。这样做看起来更好:

if __name__ == '__main__':

   try:
      print sys.version
      raiseException(12345, 'skip TrackCleanup and raise to do serial format.')

   except CRaiseException, exceptionData:
      try:
         failData = exceptionData.failureData
         print "failureData = %s" %str(failData)

         failCode = failData[0][2]

         print "failCode = %s" %str(failCode)
         print "Tuple exceptionData   PASS"

      except:
         print "Non-tuple exceptioData   FAIL"
         print "Traceback %s" %traceback.format_exc()

然后您还可以避免我最初建议的丑陋的failureData.failureData[0][2]情况。在

相关问题 更多 >

    热门问题