4

我有 2 个功能:

public void WithdrawMoney()
{
    //Take money from bank account
    //Exceptions abort the operation and are printed
    //Rethrow exception if called by TransferMoney()
}

public void TransferMoney()
{
    //Take money from one account and only deposit on another account if no exceptions were caught in WithdrawMoney()
    WithdrawMoney(); 
    DepositMoney();     
}

我想要的是能够重新抛出发生在WithdrawMoney()中的异常,只有当它被TransferMoney()调用时。如果我只是想从账户中取款,必须处理异常,但不必重新抛出,因为它不是由其他方法调用的。

除了使用布尔值之外,我想到了另一种解决方案。我可以查看堆栈跟踪,看看TransferMoney()是否调用了WithdrawMoney(),如果确实如此,则只重新抛出异常。或者有没有办法查看方法中是否发生异常?

我只是想知道您是否可以在抛出异常之前检查是否可以在 catch 块中抛出异常。如果我总是抛出它,当我直接调用WithdrawMoney()时,异常将不会被处理。

4

4 回答 4

4

一个方法不应该因为一些难以遵循和记录的任意条件而表现不同。

您应该重构出您想要在内部使用的提款方法的一部分,以便您从外部获得一种方法并从内部获得一种方法。

private void MakeWithdrawal() {
    //Take money from bank account
    //Exceptions abort the operation
}

public void WithdrawMoney()
{
    MakeWithdrawal();
    //Exceptions are printed
}

public void TransferMoney()
{
    //Take money from one account and only deposit on another account if no exceptions were caught in WithdrawMoney()
    MakeWithdrawal();
    DepositMoney();     
    //Exceptions are printed
}
于 2012-09-02T10:41:50.957 回答
3

只需添加一个包装器。单一责任人也适用于方法。

private void WithdrawMoney()
{
    // Take money from bank account

    // _Always_ Rethrow 
}

public void WithdrawMoneyPublic()
{
   // call WithdrawMoney and handle the exceptions
}
于 2012-09-02T10:34:37.807 回答
2

您可以考虑在函数调用中添加可选参数:

public void WithdrawMoney(bool throwOnError = false)
{
    //Do stuff
    catch(Exception ex)
    {
        if(throwOnError) throw;
    } 
    //Do stuff
}

public void TransferMoney()
{
    WithdrawMoney(true);
}

但是,这是从“框架设计指南”中删除的,作为您不应该编写的代码示例。这是一本极好的书。

于 2012-09-02T11:09:26.907 回答
1

为什么会有例外?

为什么不让(甚至可能两个)方法返回布尔值,表示成功?

听起来你有 bools 的想法,但由于某种原因没有去做。为什么不呢?它是如此的合乎逻辑和简单!

取款处理内部异常并返回 false,TransferMoney 将检查并返回 false。您希望这些操作返回操作是否成功也是非常合乎逻辑的。

public bool WithdrawMoney()
{
    //Take money from bank account

    //Exceptions abort the operation and are printed, and return false

    //Flawless run returns true
}

public bool TransferMoney()
{
    //Take money from one account and only deposit
    //    on another account if WidthdrawMoney returned true
    if (WithdrawMoney())
    {
        DepositMoney();     
        return true;
    }

    return false;
}

毕竟——我会说你还需要检查第二个 WithdrawMoney 操作是否失败,以防万一——回滚你对第一个 WithdrawMoney 所做的更改。

于 2012-09-02T10:56:47.997 回答