调用Queue时可能发生哪些异常/错误.排队方法



在MSDN和Intellisense信息中,没有提到调用Queue.Enqueue方法时引发的任何异常

但是由于MSDN说

。。。。。当元素被添加到队列中时,容量会根据需要通过重新分配自动增加

我想它可能会失败,因为内存不足,无法容纳新元素。

调用Queue.Enqueue方法时还会发生哪些其他错误也许答案可以包括一个指向文档的链接,列出这个特定方法的所有链接

在调用该方法时,即使没有抛出,我如何捕捉/处理OutOfMemoryException(即使我无法从内存不足错误中恢复,我也要记录它)

我所说的"不被扔"是指

在任何方法的文档中,它总是提到该方法可以引发哪些异常,但对于该特定方法,要么没有文档记录,要么没有引发任何异常。我想知道是哪一个

以下是Enqueue方法的反汇编(取自ILSpy)

public void Enqueue(T item)
{
if (this._size == this._array.Length)
{
int num = (int)((long)this._array.Length * 200L / 100L);
if (num < this._array.Length + 4)
{
num = this._array.Length + 4;
}
this.SetCapacity(num);
}
this._array[this._tail] = item;
this._tail = (this._tail + 1) % this._array.Length;
this._size++;
this._version++;
}
private void SetCapacity(int capacity)
{
T[] array = new T[capacity];
if (this._size > 0)
{
if (this._head < this._tail)
{
Array.Copy(this._array, this._head, array, 0, this._size);
}
else
{
Array.Copy(this._array, this._head, array, 0, this._array.Length - this._head);
Array.Copy(this._array, 0, array, this._array.Length - this._head, this._tail);
}
}
this._array = array;
this._head = 0;
this._tail = ((this._size == capacity) ? 0 : this._size);
this._version++;
}

正如你所看到的,它非常简单。您可能会得到StackOverflowException或OutOfMemoryException,因为您可以始终潜在地得到这些异常。

除此之外,目前还不清楚是否会出现任何问题。您需要通过验证代码其余部分中的各种检查和保护子句来验证是否存在NullPointerException,但粗略地看一眼就会发现这种情况很可能不会发生。当然,如果您开始使用反射,您总是可以强制抛出NullPointerException。

我不知道这是否对你有帮助,但我相信它回答了你提出的问题。

如果您的唯一目标是捕获所有可能的执行并记录它们,而不做任何其他事情,那么实际上做起来很简单。

try
{
queue.Enqueue(foo);
}
catch (Exception ex)
{
LoggingMethod(ex);
throw;
}

这样做的目的是捕获所有可能捕获的异常(OutOfMemory是为数不多的可能无法捕获的异常之一),记录它,然后在保留原始堆栈跟踪的同时重新抛出异常,以便该代码段所在的代码可以在必要时处理它。

执行而不是执行throw ex;,这会导致堆栈跟踪被重新创建为指向throw ex行,并且您不知道真正的异常是从哪行代码引发的。

看过您的编辑后,这个问题更有意义了。

MSDN文档通常不会记录OutOfMemoryException可以抛出,因为基本上,任何方法调用都可以抛出它(任何分配内存的方法——几乎都是这样!)。因此,您可以假设在这种情况下可以抛出它。


要澄清捕获异常的情况,请想象以下代码:

try
{
throw new ArgumentNullException();
}
catch (ArgumentOutOfRangeException)
{ 
// This can never happen, but is perfectly legal code.
}

catch块永远不会被输入,但编译器对这段代码非常满意——它甚至不会发出警告。