我正在使用Java,我想找出创建Exception子类以抛出异常的优缺点,还是应该使用错误代码来处理biz异常?
让我们以典型的银行应用程序为例,当资金转移出错时有几个例外。即资金不足,目标账户无效,超过当天的最高转账限额。
我应该创建一个错误代码列表以返回给调用者吗?或者我应该将Exception
类(从Exception
继承)抛给调用者?
如果我要为每个商业例外创建Exception
,可能会有很多Exception
个类。
答案 0 :(得分:2)
您可以一直使用Exception类来抛出特定消息的异常,甚至可以发送错误代码。
但是,您的业务逻辑应该决定是否要创建例外或使用错误代码。
使用自定义异常会带来很大的好处,即您可以定义层次结构。对于您的银行应用程序示例,我们知道如果出现资金不足,目标帐户无效,超过当天情况的最大转移限制,那么所有这些都是由于某种原因首先是TransactionFailures。因此,您的异常层次结构可能如下所示:
TransactionFailureException
/ \
/ \
/ \
/ \
InsufficientFundException / InvalidTargetAccountException / MaxLimitReachedException
因此,异常处理为您提供了标准的业务逻辑级错误层次结构,每个人都能理解这种错误层次结构,因此有助于设置标准。
但错误代码也非常重要,因为它们仅通过代码编号指定特定问题。
建议使用两者以获得最佳的应用程序。
答案 1 :(得分:1)
异常处理的一大优势是它可以使代码更清晰。如果没有太多if语句的动作,代码看起来像是一个序列,因此从源代码中可以看出主用例。
在Java中,编译器也有帮助,因为它会强制您声明函数可能抛出的异常类型。
现在,如果您有许多不同的失败原因,那么您不必为每个原因创建单独的异常类。它们可以共享相同的异常类型,其中的枚举提供更具体的信息。或者,您可以创建单独的异常类,并使每个异常类都继承自相同的基本异常。如果处理异常的逻辑对于所有异常都是相同的,则需要捕获基本异常。
答案 2 :(得分:1)
您可以将两者结合使用,以实现强大的错误处理和记录目的。
创建预定义的错误代码列表和相应的错误描述,并让它们存储一些持久性存储。每次启动应用程序时,都会在Map中加载相同的内容。存储在持久性存储中有两个好处:
<强>一个。可扩展性:如果您有一组非常大的错误代码,最好将它们存储在表中,而不是在代码中对它们进行硬编码。
<强>湾可维护性:维护很容易。每次错误代码或错误描述发生变化时,无需修改代码。还添加任何新的错误代码很容易。例如,在错误代码表中只有一个插入查询就足以获得新的错误代码。
根据业务类别创建自定义业务例外(例如,一个类别可能是 InvalidAccountInformation ,另一个类别可能是 InvalidTransaction ,依此类推)。您可以在这些自定义业务异常中传递自定义错误代码。您可以使用错误代码获取自定义错误说明并相应地进行记录。 一个好主意是您的自定义异常应该是RuntimeException
类的子类。
答案 3 :(得分:1)
使用错误代码会导致:
在这种情况下,异常可能会有很大帮助:
如果错误代码只是一个被忽略但没有恢复的丢弃代码,那么一个包含错误代码的简单异常类型就足够了。