docstrings - python how to document functions




Devo sempre specificare un tipo di eccezione nelle istruzioni `except`? (5)

Quando si utilizza PyCharm IDE l'uso di except: senza un tipo di eccezione attiva un promemoria dall'IDE che questa clausola di eccezione è Too broad .

Dovrei ignorare questo consiglio? O è Pythonic a specificare sempre il tipo di eccezione?


È quasi sempre meglio specificare un tipo di eccezione esplicito. Se utilizzi una clausola nuda, ad except: potresti finire per rilevare eccezioni diverse da quelle che ti aspetti di catturare - questo può nascondere i bug o rendere più difficile il debug dei programmi quando non fanno ciò che ti aspetti.

Ad esempio, se stai inserendo una riga in un database, potresti voler rilevare un'eccezione che indica che la riga esiste già, quindi puoi fare un aggiornamento.

try:
    insert(connection, data)
except:
    update(connection, data)

Se si specifica una schermata vuota ad except: :, si verificherebbe anche un errore del socket che indica che il server del database è caduto. È meglio prendere solo eccezioni che sai come gestire: spesso è meglio che il programma fallisca al punto dell'eccezione piuttosto che continuare, ma comportarsi in modo strano e inaspettato.

Un caso in cui si potrebbe voler utilizzare una versione spoglia except: è al livello più alto di un programma che è necessario essere sempre in esecuzione, come un server di rete. Ma poi, devi fare molta attenzione a registrare le eccezioni, altrimenti sarà impossibile capire cosa non va. Fondamentalmente, ci dovrebbe essere al massimo un posto in un programma che fa questo.

Un corollario di tutto questo è che il tuo codice non dovrebbe mai raise Exception('some message') perché impone l'uso del codice del client except: (o except Exception: che è quasi altrettanto brutto). Dovresti definire un'eccezione specifica per il problema che vuoi segnalare (magari ereditando da alcune sottoclassi di eccezioni built-in come ValueError o TypeError ). O dovresti sollevare una specifica eccezione integrata. Ciò consente agli utenti del tuo codice di fare attenzione nel catturare solo le eccezioni che vogliono gestire.


Non è specfico su Python.

L'intero punto delle eccezioni è trattare il problema il più vicino possibile a dove è stato causato.

Quindi mantieni il codice che in circostanze eccezionali potrebbe innescare il problema e la risoluzione "prossima" l'una all'altra.

Il fatto è che non puoi conoscere tutte le eccezioni che potrebbero essere generate da un pezzo di codice. Tutto quello che puoi sapere è che se si dice che un file non ha trovato un'eccezione, puoi intercettarlo e chiedere all'utente di ottenerne uno che lo faccia o annullare la funzione.

Se ci provi, prova a capirlo, quindi non importa quale problema ci sia nella tua routine di file (sola lettura, permessi, UAC, non proprio un pdf, ecc.), Ognuno di essi cadrà nel tuo file non trovato e il tuo utente sta urlando "ma è lì, questo codice fa schifo"

Ora ci sono un paio di situazioni in cui potresti prendere tutto, ma dovrebbero essere scelti consapevolmente.

Sono catch, annulla alcune azioni locali (come la creazione o il blocco di una risorsa, (aprendo un file sul disco per scrivere per esempio), quindi si lancia di nuovo l'eccezione, per essere gestita ad un livello superiore)

L'altro è che non ti interessa perché è andato storto. Stampa ad esempio. Potresti avere un problema a tutto tondo, per dire che c'è qualche problema con la tua stampante, ordinala e non uccidere l'applicazione a causa sua. Ona è altrettanto vana se il tuo codice eseguisse una serie di compiti separati usando una sorta di programma, non vorresti che l'intera cosa morisse, perché una delle attività fallì.

Nota Se si fa quanto detto sopra, non posso raccomandare una sorta di registrazione delle eccezioni, ad esempio, prova a registrare il registro dei registri, abbastanza in alto.


Prenderai anche Control-C ad esempio, quindi non farlo a meno che non lo "lanci" di nuovo. Comunque, in quel caso dovresti usare "finalmente".


Prova questo:

try:
    #code
except ValueError:
    pass

Ho ricevuto la risposta da questo link, se qualcun altro si è imbattuto in questo problema


Specifica sempre il tipo di eccezione, ci sono molti tipi che non vuoi catturare, come SyntaxError , KeyboardInterrupt , MemoryError ecc.





pep8