Perché esistono eccezioni non rilevabili?

1

Recentemente ho chiesto una domanda su SO, dove stavo provando per capire come catturare un'eccezione in un pezzo di codice che gira indefinitamente. Inizialmente mi aspettavo che

try:
    the_code_which_runs_indefinitely_and_which_raises_an_exception()
except:
    print('the exception in the code which runs indefinitely was caught')

funzionerebbe (l'attuale codice Python è nella domanda collegata - Sto chiedendo su SE perché voglio capire la ragione della scelta nell'implementazione piuttosto che una soluzione (anche se ce ne sarebbe una per il mio problema specifico sarebbe grandioso)).

Non è così. Come accennato nella domanda, la mia supposizione selvaggia è che la costruzione try / except non sia ancora in posizione (e non sarà mai) mentre the_code_which_runs_indefinitely_and_which_raises_an_exception() è in esecuzione.

Quali sono le motivazioni alla base della decisione di avere delle eccezioni che non possono essere intercettate (quando il meccanismo di cattura è ben funzionante, e nel caso di Python addirittura incoraggiato)?

    
posta WoJ 05.09.2017 - 11:27
fonte

2 risposte

4

In Python, le eccezioni non sono usate solo per errori, ma anche per un flusso di controllo più generale. Le eccezioni di non errore non dovrebbero essere rilevate accidentalmente . Pertanto una clausola except: vuota rileva solo sottoclassi Exception , non tutte le sottoclassi BaseException . Puoi comunque rilevare queste eccezioni in modo esplicito.

La documentazione di Python elenca le seguenti eccezioni non di errore ( Python 2 ), ( Python 3.6 ):

  • SystemExit , che viene generato da sys.exit() .
  • KeyboardInterrupt , che corrisponde a Ctrl-C / il segnale SIGINT.
  • GeneratorExit , che viene generato quando un generatore o coroutine viene chiuso.
  • ... (potrebbero esserci ulteriori eccezioni definite dall'utente)

Poiché si tratta di eccezioni, le clausole finally: e with: gestori di contesto possono essere eseguite come previsto.

Questo non è correlato al problema nella tua domanda SO: la gestione degli errori nei loop di eventi è più complicata di una semplice eccezione perché non c'è un flusso di controllo lineare e uno stack di chiamate. Se si verifica un errore su un altro thread, ovviamente non sarai in grado di catturarlo.

    
risposta data 05.09.2017 - 11:56
fonte
2

What are the design reasons behind the decision to have exceptions which cannot be intercepted

Ci sono delle eccezioni che ti dicono che il sistema nel suo insieme non è più stabile - eccezioni di cui non puoi non fare nulla. Cosa puoi fare se il sistema operativo ti dice che la memoria è esaurita? Continui a continuare senza abbastanza spazio di archiviazione? Cosa succede se il tuo processo ha superato lo stack? Significa che la memoria che stai usando non può più essere considerata attendibile. cosa fai?

Per tali eccezioni, la cosa migliore da fare è arrestare il processo, cercando di garantire che nessun danno (o più danno) possa essere causato ai dati dell'utente.

    
risposta data 05.09.2017 - 11:34
fonte

Leggi altre domande sui tag