创建Exception子类来处理业务逻辑错误或使用错误代码?

时间:2016-01-09 12:33:12

标签: java exception

我正在使用Java,我想找出创建Exception子类以抛出异常的优缺点,还是应该使用错误代码来处理biz异常?

让我们以典型的银行应用程序为例,当资金转移出错时有几个例外。即资金不足,目标账户无效,超过当天的最高转账限额。

我应该创建一个错误代码列表以返回给调用者吗?或者我应该将Exception类(从Exception继承)抛给调用者?

如果我要为每个商业例外创建Exception,可能会有很多Exception个类。

4 个答案:

答案 0 :(得分:2)

您可以一直使用Exception类来抛出特定消息的异常,甚至可以发送错误代码。

但是,您的业务逻辑应该决定是否要创建例外或使用错误代码。

使用自定义异常会带来很大的好处,即您可以定义层次结构。对于您的银行应用程序示例,我们知道如果出现资金不足,目标帐户无效,超过当天情况的最大转移限制,那么所有这些都是由于某种原因首先是TransactionFailures。因此,您的异常层次结构可能如下所示:

             TransactionFailureException
             /           \
           /              \
         /                  \
       /                     \
InsufficientFundException  /  InvalidTargetAccountException / MaxLimitReachedException

因此,异常处理为您提供了标准的业务逻辑级错误层次结构,每个人都能理解这种错误层次结构,因此有助于设置标准。

但错误代码也非常重要,因为它们仅通过代码编号指定特定问题。

建议使用两者以获得最佳的应用程序。

答案 1 :(得分:1)

异常处理的一大优势是它可以使代码更清晰。如果没有太多if语句的动作,代码看起来像是一个序列,因此从源代码中可以看出主用例。

在Java中,编译器也有帮助,因为它会强制您声明函数可能抛出的异常类型。

现在,如果您有许多不同的失败原因,那么您不必为每个原因创建单独的异常类。它们可以共享相同的异常类型,其中的枚举提供更具体的信息。或者,您可以创建单独的异常类,并使每个异常类都继承自相同的基本异常。如果处理异常的逻辑对于所有异常都是相同的,则需要捕获基本异常。

答案 2 :(得分:1)

您可以将两者结合使用,以实现强大的错误处理和记录目的。

  1. 创建预定义的错误代码列表和相应的错误描述,并让它们存储一些持久性存储。每次启动应用程序时,都会在Map中加载相同的内容。存储在持久性存储中有两个好处:

    <强>一个。可扩展性:如果您有一组非常大的错误代码,最好将它们存储在表中,而不是在代码中对它们进行硬编码。

    <强>湾可维护性:维护很容易。每次错误代码或错误描述发生变化时,无需修改代码。还添加任何新的错误代码很容易。例如,在错误代码表中只有一个插入查询就足以获得新的错误代码。

  2. 根据业务类别创建自定义业务例外(例如,一个类别可能是 InvalidAccountInformation ,另一个类别可能是 InvalidTransaction ,依此类推)。您可以在这些自定义业务异常中传递自定义错误代码。您可以使用错误代码获取自定义错误说明并相应地进行记录。 一个好主意是您的自定义异常应该是RuntimeException类的子类。

答案 3 :(得分:1)

使用错误代码会导致:

  • 调用该函数并返回错误代码
  • 然后处理if-else-cascade中的错误代码
  • 并在每个条件块中恢复上下文
  • 然后恢复功能

在这种情况下,异常可能会有很大帮助:

  • 您不必返回错误代码,您可以使用返回值来获得更有意义的结果
  • 你不必处理if-else-cascade中的错误,而是使用try-catch-cascade(这样可以让读者更好地看到某些东西被恢复)
  • 您不必恢复上下文,因为异常可以保存必要的上下文信息(如果设计正确)

如果错误代码只是一个被忽略但没有恢复的丢弃代码,那么一个包含错误代码的简单异常类型就足够了。