language-agnostic - 如何区分我可以向用户展示的异常和我不能展示的异常?

标签 language-agnostic exception-handling exception

我有一些业务逻辑可以捕获一些逻辑上无效的情况,例如试图撤销已经撤销的交易。在这种情况下,正确的操作是通知用户:

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,只有那些这在逻辑上是用户的无效原因。

最佳答案

我发现有各种广泛的异常类别:

  1. TransientException - 您刚刚尝试的方法无效,但如果您再次尝试,它可能会起作用。用于数据库当前不可用等情况。
  2. InvalidRequestException - 你只是要求了一些无法完成的事情(你的例子适合这里)
  3. SystemException - 系统有问题,我们忘记了您刚才说的一切,您的 session 已结束,您需要重新开始。

我会处理这三种主要类型的异常并捕获它们中的每一种,在每种情况下都有明显的特定操作。我所有的异常都来自这三种类型。

关于language-agnostic - 如何区分我可以向用户展示的异常和我不能展示的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2998110/

相关文章:

java - 为什么参数在单个处理程序 catch 语句中是最终的

c# - 捕获仅在 Release 上发生的 .NET 错误,不抛出异常

c - C/C++ 中错误的参数处理

web-services - 服务是否应在每次请求时要求提供凭据?

algorithm - 如何知道候选人数大于槽数的选民人数

python - 以独立于平台的方式处理特定于 Windows 的异常

C++11 在不使用 try/catch block 的情况下安全地加入线程

multithreading - 同一进程中的线程有多独立?

web-services - XML-RPC 是否不好用作公共(public) API 实现的协议(protocol)?

javascript - 理解 Javascript 中的 try..catch