2012-09-12 15 views
5

ho:Forzare flusso di codice per andare ad eccezione di blocco

try: 
    ... 
except Exception, e: 
    print "Problem. %s" % str(e) 

Tuttavia, da qualche parte nel tentativo, ho bisogno di comportarsi come se fosse rilevato un'eccezione. E 'un-divinatorio da fare:

try: 
    ... 
    raise Exception, 'Type 1 error' 
    ... 

except Exception, e: 
    print "Problem. Type 2 error %s" % str(e) 
+0

sembra una cattiva progettazione ... ma è comune a sollevare eccezioni ... ma non in genere in questo modo .. . Perché hai bisogno di fare questo? potresti voler ripensare a ciò che stai cercando di ottenere. –

+0

La gestione delle eccezioni è generalmente progettata per catturare e gestire i guasti _unintended_. L'eccezione _raising_ serve ad avvisare i consumatori della tua funzione di un errore che ha impedito il completamento del blocco funzionale, insieme a qualsiasi informazione tu voglia fornire. Se si desidera uscire da un blocco funzionale come parte di un comportamento previsto, l'utilizzo di una funzione e dei relativi valori restituiti sarebbe un modo più appropriato per gestirlo. Detto questo, se stai provando a testare il comportamento del blocco 'except', allora sollevare un'eccezione nel' try' sarebbe il modo di farlo. –

+0

Ma guarda l'ultima sezione del tutorial su Python: docs.python.org/tutorial/errors.html#raising-exceptions – user1008636

risposta

5

Penso che questa sia una cattiva progettazione. Se è necessario intraprendere un'azione se (e solo se) non è stata sollevata un'eccezione, è a questo che si riferisce la clausola else. Se è necessario intraprendere un'azione in modo incondizionato, è a questo che serve finally. ecco una dimostrazione:

def myraise(arg): 
    try: 
     if arg: 
      raise ValueError('arg is True') 
    except ValueError as e: 
     print(e) 
    else: 
     print('arg is False') 
    finally: 
     print("see this no matter what") 

myraise(1) 
myraise(0) 

è necessario fattore il codice incondizionata in finally e mettere le altre cose in except/else a seconda dei casi.

+0

Ma guarda l'ultima sezione del tutorial di python: http: //docs.python. org/tutorial/errors.html # raising-exceptions – user1008636

+0

@ user1008636 - Questo è solo il tutorial. È scritto per rendere esplicito che è stata sollevata un'eccezione in 'try' e per dimostrare cosa succede in' except' o 'finally' quando c'è un'eccezione sollevata. Non è pensato per essere un esempio di buon uso di 'try' /' except'. – mgilson

4

Penso che quello che stai facendo sia "unpitonico". Trys dovrebbe in realtà coprire solo la parte piccola (idealmente una riga) del codice che si prevede possa a volte non riuscire in un certo modo. Si dovrebbe essere in grado di utilizzare try/tranne/else/fine per ottenere il comportamento desiderato:

try: 
    #line which might fail 
except ExceptionType: # the exception type which you are worried about 
    #what to do if it raises the exception 
else: 
    #this gets done if try is successful 
finally: 
    #this gets done last in both cases (try successful or not) 
Problemi correlati