Python: Catching specific exception
exception, python
Solution
in `except ValueError,e`, `e` is an instance of the exception, not a string. So when you test if `e` is not equal to a particular string, that test is always False. Try:
if str(e) != "..."
instead.
Example:
def catch(msg):
try:
raise ValueError(msg)
except ValueError as e: # as e syntax added in ~python2.5
if str(e) != "foo":
raise
else:
print("caught!")
catch("foo")
catch("bar")
Typically, you don't really want to rely on the error message if you can help it -- It's a little too fragile. If you have control over the callable `macdat`, instead of raising a `ValueError` in `macdat`, you could raise a custom exception which inherits from `ValueError`:
class MyValueError(ValueError): pass
Then you can only catch `MyValueError` and let other `ValueError`s continue on their way to be caught by something else (or not). Simple `except ValueError` will still catch this type of exception as well so it should behave the same in other code which might also be catching ValueErrors from this function.
Problem
I want to catch a specific `ValueError`, not just any `ValueError`. I tried something like this: ``` try: maquina['WPF'] = macdat(ibus, id, 'WPF') except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.': pass ``` But it raises a `SyntaxError: can't assign to literal.` Then I tried: ``` try: maquina['WPF'] = macdat(ibus, id, 'WPF') except ValueError, e: if e != 'For STRING = ’WPF’, this machine is not a wind machine.': raise ValueError, e ``` But it raises the exception, even if it is the one I want to avoid.