在Python中

时间:2015-10-30 20:27:58

标签: python exception

如果我已经定义了一个包含两个或更多参数的类:

class SomeObject:
    def __init__(self, int_param, str_param):
        #if parameters are wrong type:
            raise TypeError("wrong type") 
...

if (__name__ == "__main__"):
    try:
        invalid_obj = SomeObject('two', 'string')
        print (invalid_obj)
    except TypeError as e:
        print (e)

它打印"错误的类型",但有没有办法让它也返回哪个参数引发异常?我可以得到输出:

"错误的类型'两个'"

?我尝试过打印(e.args),打印(repr(e)),然后简单地打印(e)但是无效的参数永远不会被打印出来。只是想知道这是否可行,谢谢。

编辑:它适用于自定义异常类型,如果我列出每个被单独测试的参数 - 我也同时捕获了int_param和str_param的ValueError,所以我想看看是否可以将if语句压缩为只是:

#if params not right type: 
    raise TypeError
#if params contain invalid value:
    raise ValueError

仍然让它返回导致错误的特定无效参数。对于将来的任务,我绝对会考虑自定义异常类型;不幸的是,对于这一个,教练已经引发了TypeError"和#34;提出ValueError"作为满分的要求。她并不要求返回无效的参数,这只是我好奇,如果我能管理它。我最终得到了:

#if int_param not int:
    raise TypeError("int_param {0} given is invalid type".format(int_param))
#if str_param not int:
    raise TypeError("str_param {0} given is invalid type".format(str_param))
#if int_param is an invalid value:
    raise ValueError("int_param {0} given is invalid value".format(int_param))
....

等等。如果有人能看到更简洁的方法(没有自定义的Exception类型),请告诉我!

3 个答案:

答案 0 :(得分:3)

您可以自己制作例外:

class SomeObjectException(TypeError):
    def __init__(self, msg, which):
        TypeError.__init__(self, msg)
        self.which = which

然后:

class SomeObject:
    def __init__(self, int_param, str_param):
        #if parameters are wrong type:
            raise SomeObjectException("wrong type", int_param) 

if (__name__ == "__main__"):
    try:
        invalid_obj = SomeObject('two', 'string')
        print (invalid_obj)
    except SomeObjectException as e:
        print (e, e.which)

另见https://www.npmjs.com/package/twit

答案 1 :(得分:2)

class SomeObject:
    def __init__(self, int_param, str_param):
        if type(int_param) != int:
            raise TypeError("int_param: wrong type") 
        if type(str_param) != str:
            raise TypeError("str_param: wrong type")

答案 2 :(得分:0)

也许您应该寻找traceback模块。

raise TypeError("wrong type")

而不是traceback.print_exc()try, except,看看你是否正在寻找。