Non sono mai stato completamente soddisfatto delle eccezioni di Python. Funziona bene nella pratica, è la teoria che mi dà fastidio. :-) In particolare, perché tutto è dinamico, anche se sai che evil()
solleva solo ZorgError
e chiama spam()
che solleva EggsError
, in modo che al massimo tu riceva quei due errori da una chiamata a evil()
, qualcuno potrebbe aggiustare le cose dietro la tua schiena e cambia questo.
Detto questo, alcuni documenti sono migliori di altri. Ad esempio os.kill
può ovviamente aumentare OSError
se lo kill
fallisce e TypeError
se lo si chiama con qualcosa di diverso da due numeri interi, ma lo sapevate che può anche aumentare OverflowError
?
>>> os.kill(9999999999999, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: signed integer is greater than maximum
Se si sta tentando di scrivere ragionevolmente codice a prova di proiettile che fa le cose come leggere un pid file e sonda per vedere se un processo è in esecuzione, si scopre che devi prendere questo OverflowError
nel caso in cui il pid nel file pid è un numero intero, ma è fuori portata. Sarebbe bello se questo fosse nella documentazione (l'ho trovato con la tortura-test, invece.)
Semplicemente la cattura di tutto (except:
o except Exception
) è di solito non è adatto come di solito prende troppa (tra cui, ad esempio, RuntimeError
da uno stack overflow). Quindi, come fai a sapere cosa catturare? Penso che potrebbe essere bello se le funzioni foglia nelle librerie standard avessero un attributo "eccezioni che alzo direttamente" o un requisito di documentazione, ma semplicemente non c'è.
Edit: ho notato in un commento di cui sopra che la documentazione JSON menziona esplicitamente ValueError
. Non esplicitamente richiamato, ma trovato negli autotest di JSON, sono UnicodeDecodeError
(che è ovvio una volta che ci pensi) e AttributeError
(non così ovvio). La documentazione menziona anche che è possibile ottenere uno OverflowError
.Naturalmente, se si utilizza json.dump
, che accetta uno stream su cui scrivere, è possibile ottenere anche tutti gli errori del flusso. Questo è il motivo per cui un "elenco di eccezioni zorg()
si alza direttamente" non è sempre molto utile.
Nota: anche la documentazione menziona 'ValueError'. – torek