在这种情况下我应该使用例外吗?

Ale*_*lex 2 c# exception-handling exception

我设计了一个简单的程序,它有一个计数器类,在计数器类里面,我有一些方法可以增加计数,减少计数,等等.然后我向用户展示一个菜单,让他们输入他们的选择,例如.进入1方案一,等好了,我再也不想计数为负,因此处理这个我有计数器类的我SubtractCount方法抛出ArguemetOutOfRangeException当计数<0.

然后我的switch语句捕获该异常(如果发生).我的问题是:使用异常来确保计数永远不会是负数是不是很糟糕?我应该采用不同的方式吗?或者更好的是,有没有更好的方法来实现这一目标?

代码段:

static void Driver()
{
    switch (userChoice)
    {
        case 1: // if user picks a 1, the count is deincremented
            try {

                myObjectOfCounterClass.SubtractCount();
            }
            catch (ArguemetOutOfRangeException ex)
            {
                console.writeLine(ex.message);
            }
         break;
         // case 2, case 3 etc.
     }

class Counter
{
    private int count;

    public void SubtractCount()
    {
        if (count < 0)
            throw new ArguementOutOfRangeException("The count can never be negative!");
        else
            count--;
    } 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 7

使用控制流的异常不被视为良好实践.在您的情况下,Tester-Doer模式更适合.

您可以将Counter类更改为以下内容:

class Counter
{
    private int count;

    public bool CanSubtractCount
    {
        get { return this.count >= 0; }
    }

    public void SubtractCount()
    {
        if (!this.CanSubtractCount)
            throw new InvalidOperationException("The count can never be negative!");
        else
            this.count--;
    } 
Run Code Online (Sandbox Code Playgroud)

您现在可以像这样重写您的客户端:

static void Driver()
{
    switch (userChoice)
    {
        case 1: // if user picks a 1, the count is deincremented
            if(myObjectOfCounterClass.CanSubtractCount)
            {
                 myObjectOfCounterClass.SubtractCount();
            }
            else
            {
                 // Write a message to the user?
            }
         break;
         // case 2, case 3 etc.
     }
}
Run Code Online (Sandbox Code Playgroud)