On 03/07/2016 09:46 AM, 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.


Hi,

It is strange to morph an AttributeError in an HTTPError, anyway, you could write

try:
     fields = [getattr(Product, field) for field in fields.split(',')]
except AttributeError as e:
     raise HTTPError(str(e))

Or if you really need to write some custom message, you could parse the attribute error message for the attribute name.


# I've not tested this code !!
import re
try:
     fields = [getattr(Product, field) for field in fields.split(',')]
except AttributeError as e:
     # e.message should look like "class Foo has no attribute 'a'"
     attr = re.search(r"'(\w+)'", e.message).group(1)
     raise HTTPError('Custom message for the attribute %s' % attr)


Tbh I don't like it but it could do the job until someone raises you an attribute error with a different string pattern.

jm

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

Reply via email to