Ответ 1
in except ValueError,e
, e
- это экземпляр исключения, а не строка. Поэтому, когда вы проверяете, не соответствует ли e
конкретной строке, этот тест всегда False. Попробуйте:
if str(e) != "..."
вместо.
Пример:
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")
Как правило, вы действительно не хотите полагаться на сообщение об ошибке, если сможете это сделать - это слишком хрупко. Если вы управляете вызываемым macdat
, вместо повышения ValueError
в macdat
, вы можете создать настраиваемое исключение, которое наследует от ValueError
:
class MyValueError(ValueError): pass
Тогда вы можете только поймать MyValueError
и позволить другим ValueError
продолжать свой путь, чтобы быть пойманным чем-то другим (или нет). Простой except ValueError
по-прежнему будет захватывать этот тип исключения, поэтому он должен вести себя одинаково в другом коде, который также может захватывать ValueErrors из этой функции.