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)
使用控制流的异常不被视为良好实践.在您的情况下,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)
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |