我最近学会了如何在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')
重申我的问题,我想知道如何使我的异常看起来像预期的结果。
答案 0 :(得分:3)
您正在使用两个参数item
和字符串'not an int'
初始化自定义异常。使用多个参数初始化Exception时,* args将显示为元组:
>>> 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 :(得分:2)
根据你的课程和timgeb的回答,我有一个更好的答案:
当您检查列表中的元素是否为int时,我建议您:
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
当列表包含单个或多个非int元素时,它会增强可读性,将返回相应的错误消息。
说明:
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的回答。没有必要解释更多。