ZhangXiang wrote:

> In python3, when I write code like this:
> 
> try:
>     fields = [getattr(Product, field) for field in fields.split(',')]
> except AttributeError as e:
>     raise HTTPError(...)
> 
> I want to raise a new type of error giving a string telling the user which
> attribute is not valid. But I don't see any method I can use to get the
> attribute name except inspecting e.args[0].
> 
> Could anyone give me a hint? Maybe I miss something.
> 
> By the way, I don't quite want to change my code to a for-loop so I can
> access the field variable in exception handling.

It seems that the name of the attribute is not made available. You have to 
parse the error message or provide the name yourself:

>>> def mygetattr(object, name):
...     try:
...         return getattr(object, name)
...     except AttributeError as err:
...         err.name = name
...         raise
... 
>>> class Product:
...     foo = 42
... 
>>> fields = "foo,bar"
>>> try:
...     fields = [mygetattr(Product, field) for field in fields.split(",")]
... except AttributeError as err:
...     print(err)
...     print("Missing attribute:", err.name)
... 
type object 'Product' has no attribute 'bar'
Missing attribute: bar

Raising a subclass instead of mutating and reraising the original 
AttributeError is probably cleaner...

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to