将参数传递给自定义异常

时间:2016-01-29 23:14:18

标签: python inheritance python-3.5 custom-exceptions

我最近学会了如何在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')

重申我的问题,我想知道如何使我的异常看起来像预期的结果。

2 个答案:

答案 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)

使用filterisinstance将帮助您编写可读的类对象和检查机制。

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的回答。没有必要解释更多。