20

In Python, qual è il modo migliore per rilevare le eccezioni "tutte"?Acquisizione di tutte le eccezioni in Python

except: # do stuff with sys.exc_info()[1] 

except BaseException as exc: 

except Exception as exc: 

Il problema può essere eseguito in una discussione.

Il mio obiettivo è quello di accedere qualsiasi eccezione che potrebbe essere gettato dal codice normale senza mascherare eventuali eccezioni Python speciali, come quelli che indicano la terminazione processo ecc

Ottenere una maniglia per l'eccezione (ad esempio per le clausole sopra che contengono exc) è anche auspicabile.

risposta

20

Se avete bisogno di recuperare tutte le eccezioni e fare la stessa roba per tutti, ti suggerisco di questo:

try: 
    #stuff 
except: 
    # do some stuff 

Se non si desidera mascherare "speciali" eccezioni Python, utilizzare l'eccezione classe base

try: 
    #stuff 
except Exception: 
    # do some stuff 

per alcune eccezioni di gestione relative, catturarli esplicitamente:

try: 
    #stuff 
except FirstExceptionBaseClassYouWantToCatch as exc: 
    # do some stuff 
except SecondExceptionBaseClassYouWantToCatch as exc: 
    # do some other stuff based 
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc: 
    # do some other stuff based 

Il exception hierarchy dai documenti python dovrebbe essere una lettura utile.

+1

Grazie per il link alla gerarchia eccezione. :) – EOL

0

Per evitare il mascheramento delle eccezioni di base, è necessario "ribaltare" eventuali eccezioni che non sono quelle che si desidera esplicitamente gestire, ad es. (Adattato da 8. Errors and Exceptions):

 
import sys

try: # do something that could throw an exception: except IOError as (errno, strerror): print "I/O error({0}): {1}".format(errno, strerror) except ValueError: print "Could not convert data to an integer." except: # maybe log the exception (e.g. in debug mode) # re-raise the exception: raise

+1

Il finale 'except: raise' non fa nulla: può essere saltato del tutto; le eccezioni non-IOError e non-ValueError semplicemente non vengono catturate e vengono automaticamente generate dall'interprete. – EOL

+1

@EOL Hai ragione. Ho modificato la mia risposta per indicare perché la finale eccetto: potrebbe essere utile. – Peter

29
  • except Exception: vs except BaseException::

    La differenza tra la cattura Exception e BaseException è che secondo l'eccezione exception hierarchy come SystemExit, KeyboardInterrupt e GeneratorExit non sarà catturato quando si utilizza except Exception perché ereditano direttamente da BaseException.

  • except: vs except BaseException::

    La differenza tra questo due è principalmente in Python 2 (per quanto ne so), ed è solo quando si utilizza una vecchia classe di stile come eccezione da sollevare, in questo caso solo l'espressione-di meno tranne la clausola sarà in grado di catturare l'eccezione ad es.

    class NewStyleException(Exception): pass 
    
    try: 
        raise NewStyleException 
    except BaseException: 
        print "Caught" 
    
    class OldStyleException: pass 
    
    try: 
        raise OldStyleException 
    except BaseException: 
        print "BaseException caught when raising OldStyleException" 
    except: 
        print "Caught" 
    
+2

Ho reso 'NewStyleException' ereditato da' Exception', come è ufficialmente raccomandato (http://docs.python.org/tutorial/errors.html#user-defined-exceptions). – EOL

Problemi correlati