2016-01-29 4 views
4

Недавно я узнал, как создавать пользовательские исключения в Python и внедрять их в класс. Я пытаюсь добавить дополнительный аргумент в свое исключение для большей ясности и не могу заставить форматирование сделать правильно.Передача аргументов в настраиваемое исключение

Вот что я пытаюсь:

class NonIntError(Exception): 
    pass 

class intlist(List): 

    def __init__(self, lst = []): 

     for item in lst: 
      #throws error if list contains something other that int 
      if type(item) != int: 
       raise NonIntError(item, 'not an int') 

      else: 
       self.append(item) 

Ожидаемые результаты

il = intlist([1,2,3,'apple']) 

>>> NonIntError: apple not an int 

результатов с ошибкой

il = intlist([1,2,3,'apple']) 

>>> NonIntError: ('apple', 'not an int') 

Подтвердив мой вопрос, я хотел бы знать, как сделать мое исключение выглядят как ожидаемые результаты.

ответ

3

Вы инициализируете свое собственное исключение с два аргументами, item и строками 'not an int'. При инициализации исключения с несколькими аргументами, то * арг будет отображаться в виде кортежа:

>>> raise NonIntError('hi', 1, [1,2,3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
__main__.NonIntError: ('hi', 1, [1, 2, 3]) 

Чтобы получить нужный результат, пройти ровно одну строку, то есть:

>>> item = 'apple' 
>>> raise NonIntError(item + ' not an int') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
__main__.NonIntError: apple not an int 
1

По вашему классу и ответ timgeb, я есть лучший ответ:

Когда вы проверяете список или нет его элемент ИНТ, я рекомендую вам:

class intlist(object): 

    def __init__(self, lst = []): 
     not_int_list = filter(lambda x: not isinstance(x, int), lst) 
     if not_int_list: 
      if len(not_int_list) > 1: 
       items = ', '.join(not_int_list) 
       raise NonIntError(items + ' are not int type') 
      item = not_int_list.pop() 
      raise NonIntError(item + ' is not int type') 

Когда il = intlist([1,2,3,'apple']), он возвращает:

>>> NonIntError: apple is not int type 

Когда il = intlist([1,2,3,'apple','banana']), он возвращает:

>>> NonIntError: apple, banana are not int type 

Это укрепит читаемым, когда список включает в себя одну или несколько не-ИНТ элемент будет возвращать соответствующее сообщение об ошибке ,


Объяснение:

not_int_list = filter(lambda x: not isinstance(x, int), lst) 

Использование filter и isinstance поможет вам по кодированию читаемого объекта класса и механизму проверки.

if len(not_int_list) > 1: 
    items = ', '.join(not_int_list) 
    raise NonIntError(items + ' are not int type') 
item = not_int_list.pop() 
raise NonIntError(item + ' is not int type') 

Он вернет соответствующее сообщение об ошибке, если в списке имеется один или несколько недопустимых элементов.

NonIntError(items + ' are not int type') 

Существует ответ от timgeb. Больше не нужно объяснять.