Collections pop是否抛出异常?

Collections pop是否抛出异常?,collections,concurrency,clojure,Collections,Concurrency,Clojure,pop函数的文档说明: user> (doc pop) ------------------------- clojure.core/pop ([coll]) For a list or queue, returns a new list/queue without the first item, for a vector, returns a new vector without the last item. If the collection is empty, throw

pop
函数的文档说明:

user> (doc pop)
-------------------------
clojure.core/pop
([coll])
  For a list or queue, returns a new list/queue without the first
  item, for a vector, returns a new vector without the last item. If
  the collection is empty, throws an exception.
但是,我似乎无法重现应该抛出异常的行为

例如,在这里,我向队列中添加了三个元素,然后
pop
五次:根据文档,这不应该起作用。然而,我得到的不是一个例外,而是零

(peek (pop (pop (pop (pop (pop (conj (conj (conj clojure.lang.PersistentQueue/EMPTY 4) 5) 6)))))))
现在我非常喜欢返回一个空队列,而不是在尝试从空队列中弹出
pop
时抛出异常,但我想了解为什么行为与文档不同(至少与我从阅读文档中了解到的不同)


基本上,我想知道我是否应该在这里“保护”自己不受异常的影响,或者我是否可以安全地假设空队列总是返回一个空队列(这将与文档相矛盾)。

你是正确的,文档字符串中似乎存在矛盾。当前,弹出一个空队列会产生一个空队列。从以下评论中可以看出,核心开发人员正在讨论期望的行为:

public PersistentQueue pop(){
如果(f==null)//hmmm…空队列弹出->空队列?
归还这个;
//抛出新的非法状态异常(“弹出空队列”);
ISeq f1=f.next();
持续向量r1=r;
如果(f1==null)
{
f1=RT.seq(r);
r1=null;
}
返回新的PersistentQueue(meta(),cnt-1,f1,r1);
}

如果我想采取防御措施,我可以写一个安全的POP函数,在引擎盖下使用Test/catch,如果抛出异常,返回NIL,我不知道试图捕获一个还不存在的异常(也许永远不会)。. 我可能更倾向于测试自己是否为空,或者抛出异常,或者在我认为合适的情况下返回nil。