Pracuję nad biblioteką wysyłania wiadomości e-mail i chcę być w stanie przechwytywać wyjątki generowane przez nadawców (SMTP, Google AppEngine itp.) I zawijać je w łatwych do odczytywania wyjątków biblioteka (ConnectionError, MessageSendError itd.), z oryginalnym tracebackem nienaruszonym, aby można było debugować. Jaki jest najlepszy sposób to zrobić w Pythonie 2?Wyjątki od pakowania w języku Python
24
A
Odpowiedz
24
Najprostszym sposobem byłoby przebicie za pomocą starego obiektu śledzenia. Poniższy przykład pokazuje to:
import sys
def a():
def b():
raise AssertionError("1")
b()
try:
a()
except AssertionError: # some specific exception you want to wrap
trace = sys.exc_info()[2]
raise Exception("error description"), None, trace
Sprawdź dokumentację raise statement o szczegóły tych trzech parametrów. Mój przykład będzie drukować:
Traceback (most recent call last):
File "C:\...\test.py", line 9, in <module>
a()
File "C:\...\test.py", line 6, in a
b()
File "C:\...\test.py", line 5, in b
raise AssertionError("1")
Exception: error description
Dla kompletności w Pythonie 3 chcesz użyć raise MyException(...) from e
syntax.
1
Ta odpowiedź jest prawdopodobnie nieco spóźniona, ale można zawinąć funkcję w postaci python decorator.
Oto prosty cheatsheet na temat różnych dekoratorów.
Oto przykładowy kod, jak to zrobić. Po prostu zmień decorator
, aby wychwycić różne błędy na różne sposoby.
def decorator(wrapped_function):
def _wrapper(*args, **kwargs):
try:
# do something before the function call
result = wrapped_function(*args, **kwargs)
# do something after the function call
except TypeError:
print("TypeError")
except IndexError:
print("IndexError")
# return result
return _wrapper
@decorator
def type_error():
return 1/'a'
@decorator
def index_error():
return ['foo', 'bar'][5]
type_error()
index_error()
Powiązane problemy
- 1. Dokumentacja pakowania w języku Python
- 2. Implementacje algorytmu pakowania w języku Python
- 3. Pula wątków w języku Python obsługująca wyjątki
- 4. Pycharm - Nie znaleziono narzędzi do pakowania w języku Python
- 5. Python: Wyjątki w zadaniach
- 6. Sprawdzane wyjątki od odwiedzających
- 7. Utrzymywanie pakowania w python biblioteki C
- 8. Python, wyróżniający niestandardowe wyjątki
- 9. Wyjątki od testu MS VS
- 10. W języku C# jak zdefiniować własne wyjątki?
- 11. Wyjątek protokołowania w języku Python
- 12. zapisz Wyjątki od pliku w pythonie
- 13. Deskryptory w języku Python nie działają w języku Python 2.7
- 14. Algorytm pakowania 3d bin
- 15. języki pisane od prawej do lewej w języku Python
- 16. Rejestrowanie w języku Python - określanie numeru poziomu od nazwy
- 17. Szyfrowanie AES w języku Python różni się od iOS
- 18. Pakiety w języku Python?
- 19. Wątki w języku Python
- 20. iteritems w języku Python
- 21. ++ operator w języku Python
- 22. Logowanie w języku Python?
- 23. sqlite3 w języku Python
- 24. Przerwa w języku Python
- 25. Czas letni w języku Python
- 26. Hash Map w języku Python
- 27. Zapobieganie importom w języku Python
- 28. rzucanie Sprawdzone Wyjątki od zajęć Anonymous wewnętrzne
- 29. Obsługa wyjątków asynchronicznych w języku Python
- 30. Usuwanie duplikatów w języku Python
'raise Exception (" opis błędu "), None, trace' ma skutek uboczny polegający na utracie oryginalnego komunikatu o błędzie. Ktoś wie, jak to obejść? –
Skończyło się na tym, że korzystałem z wiadomości z oryginalnego wyjątku i łączę ją z nową wiadomością. –
Wykonuję to w następujący sposób: 'raise Exception (" opis błędu \ nOprzez: {}: {} ".format (typ (e) .__ nazwa__, str (e))), Brak, sys.exc_info() [2 ] ' –