如何抛出下溢异常?

3
在C#中,我可以抛出一个溢出异常:
throw new System.OverflowException("Cannot push onto a full stack.");

如何抛出下溢异常?

throw new System.UnderflowException("Cannot pop from an empty stack.");

看起来UnderflowException不是System的一个方法。


2
那不是技术上仍然会出现OverflowException吗?因为你试图访问一个超出可用范围的索引。 - Staeff
@Staeff 不是的,它试图访问索引 -1 - theonlygusti
1
在这种情况下,您应该创建自己的异常。 - BWA
1
还要注意,当您尝试这样做时,Microsoft会使用InvalidOperationException。https://msdn.microsoft.com/zh-cn/library/9say334k(v=vs.110).aspx - Staeff
3
溢出异常被定义为“当在检查的上下文中进行算术、转换或转型操作导致溢出时抛出的异常”,与堆栈无关。 - stuartd
显示剩余2条评论
2个回答

8

没有UnderflowException异常。如果你执行以下操作:

var stack = new Stack();
stack.Push(1);
var x1 = stack.Pop();
var x2 = stack.Pop();

您将会收到一个 InvalidOperationException 异常:

堆栈为空。

但您完全可以创建自己的 Exception 类:

public class UnderflowException : Exception
{
    public UnderflowException(string message): base(message)
    {           
    }
}

如果需要,可以将其抛弃:

throw new UnderflowException("Could not pop from empty stack");

我必须为计算机科学课程创建自己的堆栈实现。我的老师希望我抛出下溢和上溢异常。 - theonlygusti
@theonlygusti 这有点傻,但你可以自己创建它们。 - Staeff
@Staeff 我知道这有点愚蠢。我已经和我的老师谈过了,但她很坚持。 - theonlygusti
@maksin-simkin 应该将 UnderflowException 也扩展为 ArithmeticException,就像 OverflowException 一样:https://msdn.microsoft.com/zh-cn/library/system.overflowexception(v=vs.110).aspx - Staeff
1
@theonlygusti,这既不是溢出也不是下溢。这是一个超出范围的情况。实际上,您也不应该使用OverflowException,因为它具有不适用于此处的非常特定的含义。如果您想要,可以从“IndexOutOfRange”继承。 - Panagiotis Kanavos

1
你可以创建自己的空异常并抛出:
public class UnderflowException : Exception
{

}

然后在你的函数中:
throw new UnderflowException();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接