2010-01-27 7 views
8

Qual è la differenza tra sollevare un'eccezione e semplicemente stampare un errore.Aumentare un'eccezione o stampare?

Per esempio, che cosa è il vantaggio di utilizzare il seguente:

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

invece di limitarsi a:

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

io sono un principiante, si prega di prendere facilmente su di me. :)

+3

Quando hai provato questo codice, quali differenze hai osservato? –

risposta

8

Raising an error arresta l'intero programma in quel punto (a meno che l'eccezione e 'colto), mentre printing il messaggio appena scrive qualcosa per stdout - l'uscita potrebbe essere convogliato ad un altro strumento, o qualcuno non sia in esecuzione l'applicazione dalla riga di comando e l'output print potrebbe non essere mai visto.

Per esempio, che se il codice è come:

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

e io chiamo il tuo script come:

number_source.txt yours.py | sum_all_lines.sh

Se yours.py restituisce il testo normale tra i numeri, allora forse il mio sum_all_lines.sh avrà esito negativo perché era in attesa di tutti i numeri. Tuttavia, se yours.py si chiude a causa di un'eccezione, allora sum_all_lines.sh non si concluderà e sarà chiaro a me perché la somma non è riuscita.

Naturalmente, questo è solo un esempio e il tuo caso particolare potrebbe essere completamente diverso.

+2

Hai omesso questo: http: //docs.python.org/reference/simple_stmts.html#the-raise-statement e http://docs.python.org/reference/simple_stmts.html#the-print-statement. –

6

Dipende se è possibile gestire size < 0 nel punto in cui viene rilevato size < 0.

Se si può gestire da subito a stampare, quindi print, in caso contrario, sollevare un'eccezione, di delegare la gestione di tale condizione a qualcosa di più in alto lo stack di chiamate, in questo modo:

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" 

In (esempio molto forzato) sopra, la funzione divide_three_by non sa cosa fare se si passa 0 - a volte si potrebbe semplicemente voler stampare un messaggio (es. se val proviene da input dell'utente), a volte si potrebbe voler semplicemente ignorarlo e assegna un valore predefinito. Dato che la funzione non sa cosa fare, dovrebbe passare la responsabilità di gestire tale condizione sul callstack a quello che ha chiamato (e se non può essere gestita lì, continuerà a essere passata al callstack fino a quando qualcosa lo maneggia , o finché non raggiunge il livello più alto, a quel punto il tuo programma terminerà).

Per ulteriori informazioni sulla gestione delle eccezioni in Python, dai un'occhiata allo Errors and Exceptions tutorial nella documentazione di Python.

+0

Dovrei probabilmente sottolineare che il mio esempio è * estremamente inventato *, data l'esistenza di "ZeroDivisionError' (http://docs.python.org/library/exceptions.html#exceptions.ZeroDivisionError) –

2

La differenza chiave è se il programma continuerà a funzionare dopo il controllo degli errori.

Per questo caso:

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

Questo sarà solo stampare il messaggio sullo standard output e il programma continuerà oltre il vostro controllo.Quindi se ad un certo punto nel tuo codice utilizzi size ed è inferiore a 0 potresti ricevere un errore.

Per l'altro caso:

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

In questo caso il programma non continuerà oltre il vostro controllo, un'eccezione sarà sollevata. Se non viene gestito, l'intero programma terminerà.

La maggior parte delle volte si vorrà sollevare un'eccezione e disporre di un gestore di eccezioni esterno che raccoglie l'eccezione e indica l'utilizzo dell'errore e, se possibile, consente loro di immettere nuovamente l'input.

3

Un'altra considerazione è quando si sviluppa un modulo che potrebbe essere utilizzato in altri programmi. In tal caso è preferibile lanciare un'eccezione e lasciare che il codice chiamante gestisca l'errore. Il chiamante dovrebbe sapere che qualcosa è andato storto e agire di conseguenza.

... richie