4

我在处理服务层上完成的“业务验证”时有一个问题。下面的代码显示了一个典型的账户资金转账示例,验证资金充足,转账金额小于定义的限制。

在此示例中,调用者必须处理和捕获 Action 类中定义的异常,并使用相应的 ActionError 来显示错误消息。

对所有业务验证使用异常是“必须”的吗?

如果我决定不为此使用异常,我将不得不在业务层中定义相应的 ActionError(这违反了耦合/内聚)规则在某种意义上。

应该如何处理由服务层传播回 Action 类的消息?

public void transfer(String fromAccount, String toAccount, double amount) throws InsufficientFundsException, TransferLimitException, FactoryException { 
    try { 
        Account from = getAccountHome().findByPrimaryKey( 
new AccountKey(fromAccount)); 
        Account to = getAccountHome().findByPrimaryKey( 
new AccountKey(toAccount)); 
        if (from.getBalance() < amount) 
            throw new InsufficientFundsException(); // Add action errors

        if (from.getTransferLimit() > amount) 
            throw new TransferLimitException();  // Add action errors
        to.deposit(amount); 
        from.withdraw(amount); 
    } catch (Exception e) { 
        throw new FactoryException( 
"cannot perform transfer. Nested exception is " + e); 
    } 
}
4

1 回答 1

6

您的业​​务应该在模型中处理,并且您的业务逻辑中遇到的任何问题都应该传播给调用者,在本例中是 Struts Action 类。

但是您不想将您的 Struts 类(Action、ActionForm、ActionError、ActionMessage 等)与模型耦合,因此您基本上有两种方法可以通知调用者任何问题:

  • 返回一些调用者可以检查的错误代码;
  • 抛出一些调用者可以捕获的异常。

更喜欢使用异常,因为无论执行链有多深,它们都可以从业务层内部的任何地方抛出到顶层。这使业务代码保持干净,因为您不必像第一种方法那样冒泡错误代码。

然后异常将被 Action 类捕获,并将它们转换为 ActionError 对象以显示在视图中。只要确保你没有过度使用它并最终扔掉厨房水槽,否则你的 Action 课程将挤满过多的 try-catch 块。此外,您可以让异常传播并创建某种异常处理程序,以捕获从下面抛出的所有异常并根据异常类型重定向到适当的视图。

于 2012-04-16T15:25:40.487 回答