Python: Queue.Empty Ausnahmebehandlung

Nach einer kurzen Debatte mit jemandem über die Ausnahmebehandlung in Python - ausgelöst durch die Behandlung eines Warteschlangenobjekts - dachte ich, ich würde es dort rausschmeißen ...

METHODE 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()
Methode 2:
import Queue

q = Queue.Queue()

if q.empty():
    #Handle empty queue here
else:
    task = q.get()
    #Handle task here
    q.task_done()

Ein Argument ist, dass Methode 1 falsch ist, weil die leere Warteschlange kein Fehler ist und daher nicht mit der Ausnahme Queue.Empty behandelt werden sollte. Darüber hinaus kann das Debuggen durch diese Codierung erschwert werden, wenn Sie bedenken, dass der Teil zur Aufgabenbehandlung möglicherweise sehr groß sein kann.

Das andere Argument ist, dass beide Wege in Python akzeptabel sind und dass die Behandlung der Aufgabe außerhalb von try / except das Debuggen unterstützen kann, wenn die Behandlung der Aufgabe groß ist, obwohl man sich einig ist, dass dies hässlicher aussehen könnte als die Verwendung von Methode 2.

Meinungen?

UPDATE: Ein bisschen mehr Info nachdem Antwort 1 durchgekommen ist ... Die Debatte wurde gestartet, nachdem Methode 1 in einem Multithread-Code verwendet wurde. In diesem Fall erhält der Code die Sperre (von einem threading.Lock-Objekt) und gibt sie frei, sobald die zurückgegebene Task oder Queue.Empty ausgelöst wurde

UPDATE 2: Uns beiden war nicht bekannt, dass das Queue-Objekt threadsicher ist. Sieht aus wie versuchen / außer ist der Weg zu gehen!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage