2014-07-14 13 views
5

Sono uno sviluppatore Java che c'è di nuovo a Python e sto riscrivendo una classe Java come classe Python. Sto cercando di imitare il flusso della classe originale nella mia classe Python, per quanto possibile. La classe Java ha poche righe con,fa Python hanno un equivalente Java di throw new Exception ("testo qui")

if(condition) 
     throw new Exception("text here") 

Ho cercato sul Python documentation for exceptions e non sono stato in grado di trovare un Python equivalente alla sintassi Java.

Ho provato qualcosa (penso che è vicino) con raise Exception("text here") leggendo questo StackOverflow post ma sembra come se questo è per l'uso all'interno di un blocco tryexcept e causerà un salto dal try blocco al blocco except; E sto cercando di evitare le tryexcept blocchi e solo un'eccezione.

Una soluzione Credo che potrebbe funzionare è questo,

try: 
     if(condition): 
      raise Exception("text here") 
    except: 
     ... 

Ma mi piacerebbe sapere se c'è un approccio più strettamente legato all'approccio Java in modo da poter mantenere la maggior quantità di flusso possibile (farli sembrare simili).

+0

'raise' è come' throw'; 'try' è come' try'. Non * devi * aggiungere un blocco 'try' per usare le eccezioni in Python. – Ryan

+0

L'eccezione Java fa esattamente la stessa cosa: salta al blocco di cattura più vicino o produce la traccia dello stack :) Prova a dire "tranne: passa" e guarda cosa succede. – Ashalynd

+1

Si noti che è possibile derivare le proprie eccezioni: https://docs.python.org/2/tutorial/errors.html#user-defined-exceptions –

risposta

2

Dimenticate la prova, il codice sarebbe esattamente l'equivalente senza di essa

Come altri indicò: questo getta (e non cattura o gestire l'eccezione):

condition = "Foo" 
if(condition is "Foo"): 
     raise Exception("FooException") 

Tuttavia, se si desidera gestire come si farebbe se si fosse gettato nel metodo java poi:

come spiegato in this documentation sarete gettarli da un metodo e poi tutto quello che dovrete d o prova il metodo e non tutte le singole condizioni nel metodo.

#!/usr/local/bin/python2.7 

def foo(num): 
    if (num == 2): 
     raise Exception("2Exception") 
    if (num == 3): 
     raise Exception("Numception") 

def handleError(e): 
    print(e) 

def main(): 
    try: 
    foo(3) 
    print("no errors") 
    except Exception, e: 
    handleError(e) 


if __name__ == "__main__": 
    main() 
+0

Questo è molto chiaro e conciso ed è per questo che l'ho accettato come risposta. Una domanda veloce che non è un grosso problema, quando uso il tuo codice la mia stampa ha una strana virgola dopo il testo Eccezione ('Qualcosa è successo',) Sai perché? (Di nuovo, questa risposta era esattamente ciò di cui avevo bisogno!) –

+1

@ 2g7hgfdr8324, deve essere qualcosa nel tuo ambiente se lo provi [qui] (http://www.compileonline.com/execute_python_online.php) non vedrai la virgola che stai vedendo per qualche motivo nel tuo computer. – Mansueli

1
if (condition):  
    raise Exception("test") 

sarà compiere ciò che si desidera. Provaci.

+0

Ho provato questo, ma il testo non viene visualizzato. Qualche idea? –

+0

Lo ha fatto nel mio caso: guarda la fine della traccia dello stack. Se non si desidera traccia di stack, è necessario prenderlo o definire un'eccezione che stampa il messaggio di errore senza traccia. –

1

Se non si vuole intercettare l'eccezione, allora questo è probabilmente quello che si vuole:

if condition: 
    raise Exception("something bad happened!") 

Se si DESIDERA intercettare l'eccezione, quindi utilizzando meta di Python/eccezione è la strada da percorrere .

5

gestione delle eccezioni è forse l'aspetto un aspetto non banale di Python che differisce meno da Java, sia nella sintassi e semantica. È davvero solo raise Exception("text here"). No, non deve essere lessicalmente all'interno di un blocco try. Come in Java, si propaga lo stack di chiamate finché finalmente incontra un try blocco (con un except clausola di allineamento), o se non v'è tale blocco, termina il programma e un messaggio d'errore.

1
raise StandardError("message") 

è perfettamente codice valido ovunque. Di fatto, sollevare un'eccezione all'interno di un blocco try/except solitamente viene eseguita solo per mostrare la gestione degli errori del caso. In realtà non ha senso sollevare e gestire un'eccezione all'interno della stessa funzione.

+3

'StandardError' non esiste in Python 3, è piuttosto oscuro in Python 2, ed è inteso come superclasse per la maggior parte delle eccezioni (per consentire di catturare" errori "senza catturare" eccezioni del flusso di controllo ") anziché essere istanziato. 'Exception' è un equivalente più vicino a Java. – delnan