Python: Exception in the separated module works wrong

落爺英雄遲暮 提交于 2019-12-11 16:24:22

问题


I've created new exception class and I like to give it representation of errors like in OSError class. Here is what I want:

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

What should I do? Can I do this if I inherit from base Exception class? Here is what I've tried (example from module for work with 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)

It works wrong and returns just error name for Python 2 and empty string for Python 3. How can I get such behaviour as I want? Thanks!


回答1:


You should implement __repr__ method instead of __str__

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

That will work:

 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)


来源:https://stackoverflow.com/questions/11173945/python-exception-in-the-separated-module-works-wrong

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!