2013-06-13 7 views
17

RozważmyW jaki sposób mogę łatwiej stłumić poprzednie wyjątki, gdy podniosę własny wyjątek?

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

Po uruchomieniu, jeśli nie jest zainstalowany someProprietaryModule, widzi:

(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... 

Może nie chcą "Podczas obchodzenia powyższego wyjątku ..." linii (i linie nad nim), aby się pojawiły. Mógłbym to zrobić:

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

Ale to wydaje się trochę hackować. Co jeszcze mogę zrobić?

+0

To może pomóc http://stackoverflow.com/questions/1319615/proper-way-to-declare-custom-exceptions- in-modern-python –

Odpowiedz

26

W tej sytuacji może być używany język Python 3.3 i nowszy raise ... from None.

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

To przynosi oczekiwane rezultaty.

+0

Właśnie napisałem to samo. Zobacz także [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) jest tym, co dodało składnię 'from None'. –

0

Można to zrobić w ten sposób w Pythonie 2.7 i 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...') 
Powiązane problemy