当我提出它时,如何设置Python内置异常的消息属性

时间:2015-08-01 16:49:47

标签: python exception

我知道我可以在引发它时为Exception(或其任何子类)指定任意数量的参数,但我发现Exceptions有一个未填充的消息属性。

def throw():
    raise Exception("This is my message", 10)

try:
    throw()
except Exception as E:
    print "message = ", E.message
    print E.args

产生

message = 
("This is my message", 10)

我想要做的是根据我的函数中的值无效的方式或原因来引发各种ValueErrors。我还想附上一个代码,比如

raise ValueError(1, "You need to supply a string value")
# or
raise ValueError(2, "Not a valid place name") #but it is a valid string

我正在编写一个运行用户提供的回调的代码,我期望用户的函数在某些情况下引发ValueErrors,但是它们的回调也可以调用我提供的一些库函数,我希望能够区分它们在用户的ValueErrors和Mine之间。

我知道我可以继承ValueError并明确检查该异常类型,但这似乎有点过分。这些都是用户提供的值的所有错误,所以我想将异常的第一个参数用作代码,然后以某种方式显式设置消息属性

raise ValueError(10, message = "Error 10 is something quite specific")

以上操作不起作用,因为异常不接受 init 上的关键字参数。

2 个答案:

答案 0 :(得分:0)

当你引发异常时,可以传递多个参数:

try:
    raise ValueError("message", 1, 2, 3)
except ValueError as e:
    print e
    print e[1]

异常对象只是一个元组,您可以以数组[索引]的方式访问te元组中的任何项目。

<强>输出:

('message', 1, 2, 3)
1

答案 1 :(得分:0)

使用单个参数创建Exception实例时,将设置message属性。否则它是空的:

In [1]: Exception(42).message
Out[1]: 42

In [2]: Exception('foo').message
Out[2]: 'foo'

In [3]: Exception('foo', 42).message
Out[3]: ''

当然,您可以创建Exception的实例并在提升之前手动设置其.message属性:

e = Exception()
e.message = 'test'
raise e

但是,使用自定义异常类可能会很有意义。

另请注意,{3}在{3}}中没有Exception属性,只有message