2013-06-13 3 views
17

РассмотримКак я могу более легко пресекать предыдущие исключения, когда я поднимаю свое собственное исключение в ответ?

try: 
    import someProprietaryModule 
except ImportError: 
    raise ImportError('It appears that <someProprietaryModule> is not installed...') 

При запуске, если не установлен someProprietaryModule, один видит:

(traceback data) 
ImportError: unknown module: someProprietaryModule 

During handling of the above exception, another exception occurred: 

(traceback data) 
ImportError: It appears that <someProprietaryModule> is not installed... 

Может быть, я не хочу, чтобы «Во время обработки вышеуказанного исключения ...» линии (и линии над ним). Я мог бы это сделать:

_moduleInstalled = True 
try: 
    import someProprietaryModule 
except ImportError: 
    _moduleInstalled = False 
if not _moduleInstalled: 
    raise ImportError('It appears that <someProprietaryModule> is not installed...') 

Но это похоже на взлома. Что еще я могу сделать?

+0

Это может помочь http://stackoverflow.com/questions/1319615/proper-way-to-declare-custom-exceptions- in-modern-python –

ответ

26

В Python 3.3 и более поздних версиях raise ... from None может использоваться в этой ситуации.

try: 
    import someProprietaryModule 
except ImportError: 
    raise ImportError('It appears that <someProprietaryModule> is not installed...') from None 

Это нужный результат.

+0

Собирался публиковать то же самое. См. Также [PEP3134] (http://www.python.org/dev/peps/pep-3134/). – Aya

+1

[PEP 409] (https://docs.python.org/3.3/whatsnew/3.3.html#pep-409-suppressing-exception-context) - это то, что добавило синтаксис 'from None'. –

0

Это может быть сделано, как это в Python 2.7 и Python 3:

try: 
    import someProprietaryModule 
except ImportError as e: 
    raised_error = e 

if isinstance(raised_error, ImportError): 
    raise ImportError('It appears that <someProprietaryModule> is not installed...') 
Смежные вопросы