Exception handling 这个来自Microsoft的编码示例是否演示了异常的错误使用?

Exception handling 这个来自Microsoft的编码示例是否演示了异常的错误使用?,exception-handling,Exception Handling,在演示如何使用.NET单元测试的教程中: //正在测试的方法 公共作废借方(双倍金额) { 如果(金额>m_余额) { 抛出新ArgumentOutOfRangeException(“金额”); } 如果(金额

在演示如何使用.NET单元测试的教程中:

//正在测试的方法
公共作废借方(双倍金额)
{
如果(金额>m_余额)
{
抛出新ArgumentOutOfRangeException(“金额”);
}
如果(金额<0)
{
抛出新ArgumentOutOfRangeException(“金额”);
}
m_余额+=金额;
}
现在在教程中,我们可以编写单元测试了

然而,据推测,这方面的业务逻辑如下

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

    }
试试看
{
账户.借方(金额);
}
捕获(arguementOutOfRange异常)
{
如果(金额<0)打印(“请输入正值”);
否则打印(“资金不足”);
}
现在,我称之为业务逻辑。我认为这是一个使用异常的坏例子,对吗?

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

然而,它还有另一面——抛出异常会迫使调用方处理它。错误代码比异常更容易被忽略。因此,从这个角度来看,它不一定是糟糕的设计,如果
Debit()
是某个公共API的一部分,那么它实际上可能是好的,您不希望开发人员忽略这样的条件。不过,有些人可能不同意

可以进一步改进的一种方法是派生两种自定义异常类型,例如
AmountNegativeException
InsufficientFundsException
,然后在
Debit()中抛出相应的异常类型:

if(金额>m_余额)
{
抛出新的资金不足异常(“金额”);
}
如果(金额<0)
{
抛出新金额NegativeException(“金额”);
}
这样,在调用方法时可以省略catch块中的if语句

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

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