这个来自Microsoft的编码示例是否表现出对异常的错误使用?

时间:2014-05-13 07:37:29

标签: exception-handling

从演示如何使用.NET单元测试的教程中: http://msdn.microsoft.com/en-us/library/ms182532.aspx#bkmk_prepare_the_walkthrough

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

现在在教程中这个代码就在那里,所以我们可以编写单元测试。

然而,据推测,这种业务逻辑可能类似于

try
    {
    account.Debit(amount);
    }
catch (ArguementOutOfRangeException e)
    {
    if (amount < 0) print ("Please enter enter a positive value");
    else print ("Insufficient funds"); 

    }

现在,我称之为业务逻辑。我是否认为这是使用例外的一个坏例子?

1 个答案:

答案 0 :(得分:0)

通常,此可能被认为是错误的,因为异常应该用于异常行为,即导致无效状态的行为。乍一看,在这种特殊情况下,似乎只是从DebitStatus返回错误代码或某个对象(例如Debit())可能会更好,因为超出范围的数量似乎是预期的程序流程可以继续的情况。

然而,还有另一面 - 抛出异常迫使调用者处理它。错误代码可以比异常更容易忽略。因此,从这个角度来看,它不一定是糟糕的设计,如果Debit()成为某些公共API的一部分,您可能不会想要开发人员忽略这样的条件。有些人可能不同意。

可以进一步改进的一种方法是派生两种自定义异常类型,比如AmountNegativeExceptionInsufficientFundsException,然后在Debit()中抛出适当的异常类型:

if(amount > m_balance)
{
    throw new InsufficientFundsException("amount");
}
if (amount < 0)
{
    throw new AmountNegativeException("amount");
}

这样,调用方法时可以省略catch块中的if语句。