Biblioteka innej firmy (napisana w C), której używam w moim kodzie Pythona, generuje ostrzeżenia. Chcę móc używać try
except
składni, aby poprawnie obsługiwać te ostrzeżenia. Czy jest na to sposób?
python
exception
exception-handling
warnings
Boris Gorelik
źródło
źródło
warnings.filterwarnings
robi dokładnie to, czego chcesz, nie rozumiem, jaki jest twój problem?warnings.filterwarnigns('error')
wykonuje pracę. Nie mogę znaleźć oryginalnej odpowiedzi, która zaproponowała to rozwiązanieOdpowiedzi:
Cytując z podręcznika Pythona ( 27.6.4. Testing Warnings ):
źródło
try
except
składni.fnx
coś zwróci, zachowujesz ten wynik (i nadal możesz zarządzać ostrzeżeniem).fxn()
gdy nie zwróci ostrzeżenia,w
będzie pusta lista. Jeśliw
jest pusta lista (to znaczy[]
), a następnie uruchomienie kodu daje następujący błąd:IndexError: list index out of range
. Jeśli chcesz tylko sformatować lub sprawdzić właściwości przechwyconych ostrzeżeń, lepiej użyć pętli for:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
Aby obsłużyć ostrzeżenia jako błędy, po prostu użyj tego:
Po tym będziesz mógł łapać ostrzeżenia takie same jak błędy, np. To zadziała:
PS Dodałem tę odpowiedź, ponieważ najlepsza odpowiedź w komentarzach zawiera błąd ortograficzny:
filterwarnigns
zamiastfilterwarnings
.źródło
filterwarnings
wywołania, aby złapaćWarnings
, przynajmniej w Pythonie 3. po prostu działa.Jeśli chcesz tylko, aby skrypt nie wyświetlał ostrzeżeń, możesz użyć:
źródło
Oto odmiana, która wyjaśnia, jak pracować tylko z niestandardowymi ostrzeżeniami.
źródło
W niektórych przypadkach musisz użyć ctypes, aby zmienić ostrzeżenia w błędy. Na przykład:
źródło
warnings.simplefilter('error')
, nie uzyskasz śledzenia wstecznego dla ostrzeżenia, które widziałeś w dziennikach, ale zamiast tego uzyskasz dane śledzenia z wcześniej przefiltrowanych ostrzeżeń. Użyciesimplefilter
jest również najszybszym sposobem uzyskania odpowiedzi, jeśli masz jakieś wywołanie CLI.