2010-10-08 8 views
79

Mam problem z podniesieniem ostrzeżenia w Pythonie bez konieczności awaryjnego zatrzymania/zatrzymania/przerwania programu.Jak podnieść ostrzeżenie w Pythonie bez zatrzymywania (przerywania) programu?

Używam następującej prostej funkcji, która sprawdza tylko, czy użytkownik przekazał mu niezerową liczbę. Jeśli użytkownik przejdzie zero, program powinien ostrzec użytkownika, ale kontynuować normalnie. Powinien działać jak poniższy kod, ale powinien używać klasy Warning(), Error() lub Exception() zamiast ręcznego drukowania ostrzeżenia.

Jeśli użyję poniższego kodu i przekazuję 0 do funkcji, program ulega awarii i wartość nigdy nie jest zwracana. Zamiast tego chcę, aby program działał normalnie i po prostu poinformuj użytkownika, że ​​przekazał 0 do funkcji.

def isZero(i): 
    if i != 0: 
    print "OK" 
    else: 
    raise Warning("the input is 0!") 
    return i 

Chodzi o to, że chcę, aby móc sprawdzić, że ostrzeżenie zostało rzucone testowanie go przez unittest. Jeśli po prostu wypiszę komunikat, nie jestem w stanie przetestować go z assertRaises w unittest.

Dziękuję, Tomas

+0

Jak dokładnie chcesz powiadomić użytkownika? przez e-mail lub SMS-a? bo to może być połączone, ale musisz być konkretny. – aaronasterling

+1

Dlaczego po prostu nie wydrukujesz tej wiadomości? – sje397

+1

@ sje397 Chodzi o to, że chcę być w stanie przetestować, czy zostało wysłane ostrzeżenie, testując je przez unittest. Jeśli po prostu wypiszę komunikat, nie jestem w stanie tego zrobić z assertRaises w unittest. –

Odpowiedz

68

Należy nie raise ostrzeżenie, należy używać modułu warnings. Podnosząc go, generujesz błąd, zamiast ostrzegać.

+1

Dziękuję bardzo. I jak mogę przetestować, że Ostrzeżenie zostało rzucone za pomocą unittest? Nie mogę już używać assertRaises(). –

+0

@ Tomas Novotny można przechwycić standardowe i stderr, a następnie sprawdzić, czy ciągi znaków wydane przez ostrzeżenie znajdują się w środku. – wheaties

+10

@ Tom: Nigdy nie słyszałem o chęci sprawdzenia ostrzeżenia, ale dostępny jest menedżer kontekstu ['warnings.catch_warnings'] (http://docs.python.org/library/warnings.html#warnings.catch_warnings) pozwolę ci to zrobić. – SilentGhost

139
import warnings 
warnings.warn("Warning...........Message") 

znaleźć w dokumentacji Pythona: here

+0

To powinna być odpowiedź. Przykład zabija link do dokumentacji. –

Powiązane problemy