0

Я создал новый класс исключений, и я хотел бы дать ему представление об ошибках, подобных в классе OSError. Вот что я хочу:Python: Исключение в отделенном модуле работает неправильно

>>> 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. Как я могу получить такое поведение, как я хотеть? Благодаря!

ответ

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) 
Смежные вопросы