2014-09-18 11 views
7
Python 2.7.5 (default, Feb 26 2014, 13:43:17) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> try: 
... sys.exit() 
... except: 
... print "in except" 
... 
in except 
>>> try: 
... sys.exit(0) 
... except: 
... print "in except" 
... 
in except 
>>> try: 
... sys.exit(1) 
... except: 
... print "in except" 
... 
in except 

Perché non riesco a attivare sys.exit() in prova, qualche suggerimento ... !!!python sys.exit non funziona in prova

Il codice pubblicato qui contiene tutti i dettagli della versione.

Ho provato tutti i modi possibili che conosco per attivarlo, ma ho fallito. Arriva al blocco "tranne".

Grazie in anticipo ..

+2

L'ho chiuso come duplicato, perché l'altro post spiega a) cosa va storto eb) come evitarlo. Coperte 'tranne:' le clausole non sono una buona idea, nel migliore dei casi usare 'except Exception:' per evitare di catturare 'SystemExit'. –

+0

utilizza os._exit (0) se non si desidera attivare un'eccezione. – Back2Basics

+3

@ Back2Basics: ** Non chiamare ** os._exit() '; ciò garantisce che nulla venga ripulito quando il processore esce. –

risposta

12

sys.exit() solleva un'eccezione, vale a dire SystemExit. Ecco perché atterri nel blocco-except.

Guarda questo esempio:

import sys 

try: 
    sys.exit() 
except: 
    print(sys.exc_info()[0]) 

Questo vi dà:

<type 'exceptions.SystemExit'> 

Anche se non posso immaginare che si ha alcuna ragione pratica per farlo, è possibile utilizzare questo costrutto:

import sys 

try: 
    sys.exit() # this always raises SystemExit 
except SystemExit: 
    print("sys.exit() worked as expected") 
except: 
    print("Something went horribly wrong") # some other exception got raised 
+0

C'è un modo per farlo nel blocco try. – onlyvinish

+0

Non c'è alcun motivo, dal momento che ciò che si tenta di ottenere è sollevare un'eccezione in "prova" e "catturarla" nel momento successivo. È assolutamente senza tracce ;-) – tamasgal

+4

Usa 'tranne Eccezione', perché' SystemExit' eredita direttamente da 'BaseException'. Vedi la [eccezione gerarchia] (https://docs.python.org/2/library/exceptions.html#exception-hierarchy) – Vincent

3

basato su wiki python:

Dal exit() in definitiva "solo" genera un'eccezione, uscirà dal processo solo quando viene chiamato dal thread principale e l'eccezione non viene intercettata.

e:

La funzione exit non viene chiamata quando il programma è chiuso da un segnale, quando viene rilevato un errore fatale in Python, o quando os._exit() viene chiamato.

Quindi nel codice non viene rilevato un errore interno fatale di Python, oppure os._exit() non chiamato.

+2

Non chiamare 'os._exit()' te stesso, * semplicemente non catturare 'SystemExit'. Chiamare 'os._exit()' significa che nulla viene ripulito. –

+0

@MartijnPieters ok grazie! – Kasramvd