I have this try
block in my code:
try: do_something_that_might_raise_an_exception() except ValueError as err: errmsg = 'My custom error message.' raise ValueError(errmsg)
Strictly speaking, I am actually raising another ValueError
, not the ValueError
thrown by do_something...()
, which is referred to as err
in this case. How do I attach a custom message to err
? I try the following code but fails due to err
, a ValueError
instance, not being callable:
try: do_something_that_might_raise_an_exception() except ValueError as err: errmsg = 'My custom error message.' raise err(errmsg)
Advertisement
Answer
Update: For Python 3, check Ben’s answer
To attach a message to the current exception and re-raise it: (the outer try/except is just to show the effect)
For python 2.x where x>=6:
try: try: raise ValueError # something bad... except ValueError as err: err.message=err.message+" hello" raise # re-raise current exception except ValueError as e: print(" got error of type "+ str(type(e))+" with message " +e.message)
This will also do the right thing if err
is derived from ValueError
. For example UnicodeDecodeError
.
Note that you can add whatever you like to err
. For example err.problematic_array=[1,2,3]
.
Edit: @Ducan points in a comment the above does not work with python 3 since .message
is not a member of ValueError
. Instead you could use this (valid python 2.6 or later or 3.x):
try: try: raise ValueError except ValueError as err: if not err.args: err.args=('',) err.args = err.args + ("hello",) raise except ValueError as e: print(" error was "+ str(type(e))+str(e.args))
Edit2:
Depending on what the purpose is, you can also opt for adding the extra information under your own variable name. For both python2 and python3:
try: try: raise ValueError except ValueError as err: err.extra_info = "hello" raise except ValueError as e: print(" error was "+ str(type(e))+str(e)) if 'extra_info' in dir(e): print e.extra_info