Mam ten try
blok w swoim kodzie:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
Ściśle mówiąc, w rzeczywistości wychowuję innego ValueError
, a nie ValueError
rzuconego przez do_something...()
, o którym mowa err
w tym przypadku. Jak dołączyć wiadomość niestandardową do err
? Próbuję poniższy kod, ale nie z powodu err
, na ValueError
przykład , nie jest wymagalne:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Odpowiedzi:
Aktualizacja: w przypadku Pythona 3 sprawdź odpowiedź Bena
Aby dołączyć wiadomość do bieżącego wyjątku i ponownie go zgłosić: (zewnętrzna try / z wyjątkiem służy tylko do pokazania efektu)
Dla pythona 2.x, gdzie x> = 6:
Będzie to również zrobić dobry uczynek , jeśli
err
jest pochodząca zValueError
. Na przykładUnicodeDecodeError
.Pamiętaj, że możesz dodać wszystko, co chcesz
err
. Na przykładerr.problematic_array=[1,2,3]
.Edycja: @Ducan wskazuje w komentarzu, który powyżej nie działa z Pythonem 3, ponieważ
.message
nie jest członkiemValueError
. Zamiast tego możesz użyć tego (poprawny Python 2.6 lub nowszy lub 3.x):Edit2:
W zależności od celu możesz również zdecydować się na dodanie dodatkowych informacji pod własną nazwą zmiennej. Zarówno dla python2, jak i python3:
źródło
print
prawdopodobnie powinieneś zauważyć, że twój kod nie działa w Pythonie 3.x, ponieważ nie mamessage
atrybutu dla wyjątków.err.args = (err.args[0] + " hello",) + err.args[1:]
może działać bardziej niezawodnie (a następnie po prostu przekonwertować na łańcuch, aby otrzymać wiadomość)..message
atrybutu robi cokolwiek tutaj, jest to, że ten atrybut jest jawnie drukowany. Gdybyś miał zgłosić wyjątek bez przechwytywania i drukowania, nie zobaczyłbyś, że.message
atrybut robi cokolwiek użytecznego.Jeśli masz szczęście, że obsługujesz tylko Pythona 3.x, to naprawdę staje się piękna :)
podnieść z
Możemy połączyć wyjątki za pomocą funkcji raise from .
W tym przypadku wyjątek, który przechwyciłby Twój rozmówca, ma numer wiersza miejsca, w którym zgłosiliśmy wyjątek.
Zwróć uwagę, że dolny wyjątek ma tylko ślad stosu, z którego wywołaliśmy nasz wyjątek. Wzywający może nadal uzyskać oryginalny wyjątek, uzyskując dostęp do
__cause__
atrybutu wychwyconego wyjątku.with_traceback
Lub możesz użyć with_traceback .
Korzystając z tego formularza, wyjątek, który Twój wywołujący mógłby złapać, ma śledzenie, z którego wystąpił pierwotny błąd.
Zwróć uwagę, że dolny wyjątek zawiera wiersz, w którym wykonaliśmy nieprawidłowy podział, a także wiersz, w którym ponownie podniesiono wyjątek.
źródło
raise Exception('Smelly socks') from e
zmodyfikować, aby po prostu dodać „Śmierdzące skarpetki” jako komentarz do oryginalnego śledzenia zamiast wprowadzać nowy własny ślad.raise RuntimeError("Something bad happened") from None
wydruki:
źródło
raise
bez parametrów ponownie podnosi. Jeśli OP chce dodać wiadomość, musi zgłosić nowy wyjątek i może ponownie wykorzystać wiadomość / typ oryginalnego wyjątku.Wygląda na to, że wszystkie odpowiedzi dodają informacje do e.args [0], zmieniając w ten sposób istniejący komunikat o błędzie. Czy zamiast tego rozszerzanie krotki argumentów ma jakąś wadę? Myślę, że możliwą zaletą jest to, że możesz zostawić oryginalny komunikat o błędzie w spokoju w przypadkach, gdy analiza tego ciągu jest potrzebna; i możesz dodać wiele elementów do krotki, jeśli niestandardowa obsługa błędów wygenerowała kilka komunikatów lub kodów błędów, w przypadkach, w których śledzenie zostanie przeanalizowane programowo (np. za pomocą narzędzia do monitorowania systemu).
lub
Czy widzisz wady tego podejścia?
źródło
Ten szablon kodu powinien umożliwić zgłoszenie wyjątku z niestandardową wiadomością.
źródło
Podnieś nowy wyjątek za pomocą komunikatu o błędzie za pomocą
lub
w miejscu, w którym chcesz go podnieść LUB dołącz (zamień) komunikat o błędzie do bieżącego wyjątku za pomocą 'from' (tylko obsługiwany Python 3.x):
źródło
Jest to funkcja, której używam do modyfikowania komunikatu o wyjątku w Pythonie 2.7 i 3.x przy jednoczesnym zachowaniu oryginalnego śledzenia. To wymaga
six
źródło
Wyjątki wbudowane w Pythonie 3 mają
strerror
pole:źródło
Bieżąca odpowiedź nie działa dobrze, jeśli wyjątek nie zostanie ponownie przechwycony, dołączona wiadomość nie jest wyświetlana.
Ale postępowanie jak poniżej pozwala zachować ślad i pokazuje dołączoną wiadomość niezależnie od tego, czy wyjątek zostanie ponownie przechwycony, czy nie.
(Użyłem Pythona 2.7, nie próbowałem tego w Pythonie 3)
źródło
Żadne z powyższych rozwiązań nie zrobiło dokładnie tego, co chciałem, czyli dodania pewnych informacji do pierwszej części komunikatu o błędzie, tj. Chciałem, aby użytkownicy najpierw zobaczyli mój niestandardowy komunikat.
To zadziałało dla mnie:
źródło
Działa to tylko z Pythonem 3 . Możesz zmodyfikować oryginalne argumenty wyjątku i dodać własne argumenty.
Wyjątek zapamiętuje argumenty, z którymi został utworzony. Zakładam, że jest to po to, abyś mógł zmodyfikować wyjątek.
W funkcji
reraise
poprzedzamy oryginalne argumenty wyjątku dowolnymi nowymi argumentami, które chcemy (np. Wiadomość). Na koniec ponownie zgłaszamy wyjątek, zachowując historię śledzenia wstecz.wynik
źródło
jeśli chcesz dostosować typ błędu, prostą rzeczą, jaką możesz zrobić, jest zdefiniowanie klasy błędu w oparciu o wartość ValueError.
źródło