В некоторых ситуациях ожидается, что очередь будет пустой, и в этих случаях целесообразно иметь метод, который не генерирует исключение. В других ситуациях исключительным обстоятельством является то, что очередь пуста, и для нее подходит исключение.
Создание исключений влечет за собой снижение производительности, и если вы ожидаете, что очередь будет время от времени пустой, вам не нужно обрабатывать queue-empty-logic как перехват исключения - это одновременно дорогой и трудный для чтения.
В противоположном случае, когда вы не ожидаете, что очередь будет пустой, это признак ошибки программирования или какого-то другого исключительного обстоятельства, и вы не хотите писать ужасный код проверки состояния ошибки. (например, проверка на ноль), потому что в этом случае это будет менее читабельным, чем перехват исключения (что можно сделать в другой области).