【问题标题】:Python: Exception in the separated module works wrongPython:分离模块中的异常工作错误
【发布时间】:2012-06-25 19:12:07
【问题描述】:

我创建了新的异常类,我喜欢给它表示错误,就像在 OSError 类中一样。这是我想要的:

>>> raise(MyError(1, 'info'))
MyError: [Errno 1] predefined text: info

我该怎么办?如果我从基 Exception 类继承,我可以这样做吗?这是我尝试过的(使用 gnulib 的模块示例):

class GNULibError(Exception):
  '''Exception handler for GNULib classes.'''

  def __init__(self, errno, errinfo=None):
    '''Each error has following parameters:
    errno: code of error; used to catch error type
      1: destination directory does not exist: <destdir>
      2: configure file does not exist: <configure.ac>
      3: selected module does not exist: <module>
      4: <cache> is expected to contain gl_M4_BASE([m4base])
      5: missing sourcebase argument
      6: missing docbase argument
      7: missing testsbase argument
      8: missing libname argument
    errinfo: additional info'''
    self.errno = errno; self.errinfo = errinfo
    self.args = (self.errno, self.errinfo)

  def __str__(self):
    errors = \
    [ # Begin list of errors
      "destination directory does not exist: %s" % self.errinfo,
      "configure file does not exist: %s" % self.errinfo,
      "selected module does not exist: %s" % self.errinfo,
      "%s is expected to contain gl_M4_BASE([%s])" % \
        (os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo),
      "missing sourcebase argument; cache file doesn't contain it,"
        +" so you might have to set this argument",
      "missing docbase argument; you might have to create GNULibImport" \
        +" instance with mode 0 and docbase argument",
      "missing testsbase argument; cache file doesn't contain it,"
        +" so you might have to set this argument"
      "missing libname argument; cache file doesn't contain it,"
        +" so you might have to set this argument",
      "dependencies and testflag 'default' cannot be used together",
    ] # Complete list of errors
    if not PYTHON3:
      self.message = (b'[Errno %d] %s' % \
        (self.errno, errors[self.errno -1].encode(ENCS['default'])))
    else: # if PYTHON3
      self.message = ('[Errno %d] %s' % \
        (self.errno, errors[self.errno -1]))
    return(self.message)

它工作错误,只返回 Python 2 的错误名称和 Python 3 的空字符串。我怎样才能得到我想要的这种行为?谢谢!

【问题讨论】:

    标签: python exception exception-handling error-handling python-3.x


    【解决方案1】:

    你应该实现 __repr__ 方法而不是 __str__

    http://docs.python.org/reference/datamodel.html#object.__repr__

    这会奏效:

     class GNULibError(Exception):
      '''Exception handler for GNULib classes.'''
    
      def __init__(self, errno, errinfo=None):
        '''Each error has following parameters:
        errno: code of error; used to catch error type
          1: destination directory does not exist: <destdir>
          2: configure file does not exist: <configure.ac>
          3: selected module does not exist: <module>
          4: <cache> is expected to contain gl_M4_BASE([m4base])
          5: missing sourcebase argument
          6: missing docbase argument
          7: missing testsbase argument
          8: missing libname argument
        errinfo: additional info'''
        self.errno = errno; self.errinfo = errinfo
        self.args = (self.errno, self.errinfo)
    
      def __repr__(self):
        errors = \
        [ # Begin list of errors
          "destination directory does not exist: %s" % self.errinfo,
          "configure file does not exist: %s" % self.errinfo,
          "selected module does not exist: %s" % self.errinfo,
          "%s is expected to contain gl_M4_BASE([%s])" % \
            (os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo),
          "missing sourcebase argument; cache file doesn't contain it,"
            +" so you might have to set this argument",
          "missing docbase argument; you might have to create GNULibImport" \
            +" instance with mode 0 and docbase argument",
          "missing testsbase argument; cache file doesn't contain it,"
            +" so you might have to set this argument"
          "missing libname argument; cache file doesn't contain it,"
            +" so you might have to set this argument",
          "dependencies and testflag 'default' cannot be used together",
        ] # Complete list of errors
        if not PYTHON3:
          self.message = (b'[Errno %d] %s' % \
            (self.errno, errors[self.errno -1].encode(ENCS['default'])))
        else: # if PYTHON3
          self.message = ('[Errno %d] %s' % \
            (self.errno, errors[self.errno -1]))
        return(self.message)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2016-09-03
      相关资源
      最近更新 更多