2010-01-27 16 views
8

Jaka jest różnica między podniesieniem wyjątku a zwykłym wydrukiem błędu.Podnoszenie wyjątku w stosunku do drukowania?

Na przykład, co jest z korzyścią przy użyciu następujących:

if size < 0: 
     raise ValueError('number must be non-negative') 

zamiast po prostu:

if size < 0: 
     print 'number must be non-negative' 

jestem nowicjuszem, proszę wziąć to łatwe na mnie. :)

+3

Kiedy próbowałeś tego kodu, jakie różnice zaobserwowałeś? –

Odpowiedz

8

Raising an error zatrzymuje cały program w tym momencie (chyba że wyjątek zostanie złapany), natomiast printing komunikat tylko pisze coś stdout - wyjście może być odprowadzone do innego narzędzia, czy ktoś może nie zostać uruchomiony swoją aplikację z z linii poleceń, a dane wyjściowe print nigdy nie będą widoczne.

Na przykład, co jeśli kod jest podobny:

if size < 0: 
    print 'size must be non-negative' 
else: 
    print size * 4 

i wzywam skrypt jak:

yours.py number_source.txt | sum_all_lines.sh

Jeśli yours.py wyświetli zwykły tekst pomiędzy liczbami, to być może mój sum_all_lines.sh zakończy się niepowodzeniem, ponieważ oczekuje wszystkich liczb. Jednakże, jeśli yours.py zakończy działanie z powodu wyjątku, to sum_all_lines.sh nie zostanie zakończone i będzie dla mnie jasne, dlaczego suma nie powiodła się.

Oczywiście, to tylko jeden przykład, a twój konkretny przypadek może być zupełnie inny.

+2

Pominięto: http: //docs.python.org/reference/simple_stmts.html#the-raise-statement i http://docs.python.org/reference/simple_stmts.html#the-print-statement. –

6

Zależy, czy można obsłużyć size < 0 w punkcie, w którym wykryto size < 0.

Jeśli można obsługiwać go przez drukowanie od razu, wtedy print, w przeciwnym razie wyjątek, aby powierzyć obsługę takim stanie do czegoś dalszej callstack, tak:

def divide_three_by(val): 
    if val == 0: 
    raise ValueError("Can't divide by 0") 
    return 3/val 

try: 
    divide_three_by(some_value_from_user) 
except ValueError: 
    print "You gave stupid input" 

w (wprawdzie bardzo wymyślony) powyższy przykład, funkcja divide_three_by nie wie, co zrobić, jeśli przekazujesz 0 - czasami możesz po prostu chcieć wydrukować wiadomość (np. jeśli val pochodzi z danych wprowadzonych przez użytkownika), czasami możesz po prostu zignorować to i przypisz wartość domyślną. Ponieważ funkcja nie wie, co zrobić, powinna przejąć odpowiedzialność za obsługę tego stanu w zależności od tego, co ją wywołało (i jeśli nie będzie można jej tam obsłużyć, będzie ona przekazywana dalej do stanu wywołania, dopóki coś jej nie obsłuży lub dopóki nie osiągnie najwyższego poziomu, w którym to momencie program się zakończy).

Aby uzyskać więcej informacji na temat obsługi wyjątków w języku Python, zapoznaj się z dokumentacją Errors and Exceptions tutorial w dokumentacji Pythona.

+0

Należy chyba zauważyć, że mój przykład jest * bardzo wymyślny *, biorąc pod uwagę istnienie 'ZeroDivisionError' (http://docs.python.org/library/exceptions.html#exceptions.ZeroDivisionError) –

2

Podstawową różnicą jest to, czy program będzie kontynuował działanie po sprawdzeniu błędów.

W tym przypadku:

if size < 0: 
    print 'number must be non-negative' 

To będzie po prostu wydrukować wiadomość do standardowego wyjścia i program będzie kontynuowany przeszłość czeku.Więc jeśli w którymś momencie później w twoim kodzie użyjesz size i jest to mniej niż 0 możesz dostać błąd.

Na drugim przypadku:

if size < 0: 
    raise ValueError('number must be non-negative' 

W tym przypadku program nie będzie kontynuowany przeszłość czeku wyjątek zostanie podniesiona. Jeśli nie zostanie obsłużony, wówczas cały program zostanie zakończony.

Zazwyczaj użytkownik chce zgłosić wyjątek i mieć zewnętrzny wyjątek obsługujący wyjątek i informuje go o błędzie, a jeśli to możliwe, umożliwia ponowne wprowadzenie danych wejściowych.

3

Inną kwestią jest opracowanie modułu, który może być używany w innych programach. W takim przypadku lepiej jest rzucić wyjątek i pozwolić kodowi wywołującemu na błąd. Dzwoniący powinien wiedzieć, że coś poszło nie tak i działać zgodnie z nim.

... richie

Powiązane problemy