Dopo un breve dibattito con qualcuno sulla gestione delle eccezioni in Python - ha scatenato dalla manipolazione di un oggetto di coda - ho pensato di buttare là fuori ...Python: Queue.Empty Gestione delle eccezioni
METODO 1:
import Queue
q = Queue.Queue()
try:
task=q.get(False)
#Opt 1: Handle task here and call q.task_done()
except Queue.Empty:
#Handle empty queue here
pass
#Opt2: Handle task here and call q.task_done()
METODO 2:
import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
un argomento è che il metodo 1 è sbagliato perché la coda di essere vuota non è un errore, e quindi non deve essere maneggiato con un'eccezione Queue.Empty. Inoltre, potrebbe rendere più difficile il debugging se codificato in questo modo se si considera che la parte relativa alla gestione delle attività potrebbe essere potenzialmente grande.
L'altro argomento è che in entrambi i casi è accettabile in Python e che la gestione del compito al di fuori del try/tranne potrebbe aiutare il debug in caso di manipolazione compito è di grandi dimensioni, anche se d'accordo che questo potrebbe sembrare più brutto di utilizzare il metodo 2.
Opinioni?
AGGIORNAMENTO: un po 'più di informazioni dopo la risposta 1 è venuto attraverso .... Il dibattito è stato avviato dopo il metodo 1 stava usando in qualche codice multithreaded. In tal caso, il codice acquisirà il blocco (da un oggetto threading.Lock) e lo rilascerà una volta che l'attività è ritornata o Queue.Empty viene generato
UPDATE 2: Non era noto a entrambi che il l'oggetto della coda era thread-safe. Sembra che provare/eccetto sia la strada da percorrere!
Non vedo come un blocco cambia la risposta, inoltre non capisco perché ha bisogno di un blocco, la coda è già thread-safe. –