2014-02-12 2 views
0

Я пытаюсь построить пункт except, что ловит все, кроме [так] конкретный тип исключения:Логическое «не» в Python исключение ловли

try: 
    try: 
     asdjaslk 
    except not NameError as ne: #I want this block to catch everything except NameError 
     print("!NameError- {0}: {1}".format(ne.__class__, ne)) 
except Exception as e: #NameError is the only one that should get here 
    print("Exception- {0}: {1}".format(e.__class__, e)) 

Язык принимает not в предложении except, но делает ничего с ним:

>>> Exception- <type 'exceptions.NameError'>: name 'asdjaslk' is not defined 

можно ли это сделать, или я должен повторно raise их?

ответ

4

Вы должны будете повторно подняться. Оператор except может содержать только белый список, а не черный список.

try: 
    asdjaslk 
except Exception as ne: 
    if isinstance(ne, NameError): 
     raise 

Выражение not NameError возвращает False, так что вы, по существу, пытаясь поймать:

except False: 

, но не исключение никогда не будет соответствовать булеву экземпляру.

Синтаксис позволяет использовать любое допустимое выражение Python, а исключенное исключение сопоставляется с результатом этого выражения. except SomeException if debug else SomeOtherException: отлично подходит, например.

+0

или 'кроме NameError как пе: raise' – RickyA

+0

Если Python принять Ложные как условие быть выброшен? –

+0

Ммм, все еще странно, что язык def разрешает не здесь. – RickyA

0

Вы можете можете попробовать это:

try: 
    # your code raising exceptions 

except NameError: 
    # catch the exception you don't want to catch 
    # but immediately raise it again: 
    print("re-raising NameError- {0}: {1}".format(ne.__class__, ne)) 
    raise 

except Exception as e: 
    # handle all other exceptions here 
    print("catching Exception- {0}: {1}".format(e.__class__, e)) 
    pass 
Смежные вопросы