我有一些业务逻辑可以捕获一些逻辑上无效的情况,例如试图撤销已经撤销的交易。在这种情况下,正确的操作是通知用户:
Transaction already reversed
或
Cannot reverse a reversing transaction
或
You do not have permission to reverse transactions
或
This transaction is on a session that has already been closed
或
This transaction is too old to be reversed
问题是,我如何将这些异常情况传达回调用代码,以便它们可以显示给用户?
我是否为每个案例创建一个单独的异常(exception):
catch (ETransactionAlreadyReversedException)
MessageBox.Show('Transaction already reversed')
catch (EReversingAReversingTransactionException)
MessageBox.Show('Cannot reverse a reversing transaction')
catch (ENoPermissionToReverseTranasctionException)
MessageBox.Show('You do not have permission to reverse transactions')
catch (ECannotReverseTransactionOnAlredyClosedSessionException)
MessageBox.Show('This transaction is on a session that has already been closed')
catch (ECannotReverseTooOldTransactionException)
MessageBox.Show('This transaction is too old to be reversed')
这样做的缺点是,当有一个新的逻辑案例要向用户展示时:
Tranasctions created by NSL cannot be reversed
我不只是向用户显示一条消息,而是作为未处理的异常泄漏出去,而实际上它应该由另一个 MessageBox
处理。
另一种方法是创建一个异常类:
`EReverseTransactionException`
了解这种类型的任何异常都是逻辑检查,应该用消息框处理:
catch (EReverseTransactionException)
但仍然可以理解,任何其他异常,例如涉及内存 ECC 奇偶校验错误的异常,都将继续未处理。
换句话说,我不会将ReverseTransaction()
方法抛出的所有 错误转换为EReverseTransactionException
,只有那些这在逻辑上是用户的无效原因。
最佳答案
我发现有各种广泛的异常类别:
- TransientException - 您刚刚尝试的方法无效,但如果您再次尝试,它可能会起作用。用于数据库当前不可用等情况。
- InvalidRequestException - 你只是要求了一些无法完成的事情(你的例子适合这里)
- SystemException - 系统有问题,我们忘记了您刚才说的一切,您的 session 已结束,您需要重新开始。
我会处理这三种主要类型的异常并捕获它们中的每一种,在每种情况下都有明显的特定操作。我所有的异常都来自这三种类型。
关于language-agnostic - 如何区分我可以向用户展示的异常和我不能展示的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2998110/