Python: Queue.Empty Exception Handling
Po krótkiej debacie z kimś na temat obsługi wyjątków w Pythonie - wywołanej przez obsługę obiektu kolejki - pomyślałem, że go tam wyrzucę ...
METODA 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()
METODA 2:import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
Jednym z argumentów jest to, że metoda 1 jest błędna, ponieważ pusta kolejka nie jest błędem i dlatego nie powinna być obsługiwana przy użyciu wyjątku Queue.Empty. Ponadto może to utrudnić debugowanie, gdy kodowane jest w ten sposób, jeśli uważasz, że część obsługi zadań może potencjalnie być duża.
Innym argumentem jest to, że w Pythonie akceptowana jest każda z tych metod, a obsługa zadania poza try / except może pomóc w debugowaniu, jeśli obsługa zadań jest duża, chociaż zgadza się, że może to wyglądać brzydiej niż w przypadku metody 2.
Opinie?
AKTUALIZACJA: Trochę więcej informacji po otrzymaniu odpowiedzi 1… Debata rozpoczęła się po użyciu metody 1 w jakimś kodzie wielowątkowym. W takim przypadku kod uzyska blokadę (z obiektu threading.Lock) i zwolni go, gdy tylko zadanie, które zwróciło, lub Queue.Empty zostanie wygenerowane
AKTUALIZACJA 2: Obaj nie wiedzieliśmy, że obiekt kolejki jest bezpieczny dla wątków. Wygląda na to, że spróbuj / wyjątkiem jest droga!