【问题标题】:How to handle business exceptions between two layers?如何处理两层之间的业务异常?
【发布时间】:2012-09-21 04:00:06
【问题描述】:

我有一个三层 C# 软件:UI、业务、数据库。

我有一些业务规则想要在我的业务层中实现。例如,如果两个对象具有相同的名称,则业务层需要向 UI 抛出异常。

我的问题是我的应用程序是多语言的,而我的业务层无权访问我的资源文件。所以我的 UI 需要从业务层捕获异常,并决定它将向用户显示什么消息。

我正在考虑创建一个 BusinessException 类,其属性告诉 UI 在资源文件中采用哪个键。你认为这是一个好方法吗?或者你有更好的想法?谢谢!

【问题讨论】:

    标签: c# exception exception-handling


    【解决方案1】:

    首选的解决方案是创建表示不同错误的不同异常类型,将任何重要数据作为属性添加到异常中,并让 UI 处理用户面临的错误消息。

    如果您有一个单独的 UI 设计团队想要处理向用户显示的文本(包括错误消息),这是理想的选择。坦率地说,开发人员倾向于为其他开发人员而不是为用户编写好的错误消息。

    否则,在异常中嵌入某种形式的消息 ID,以便 UI 可以查找(如您所建议的那样)或本地化业务层中的错误消息。

    【讨论】:

    • 您的意思是最好的方法是为我拥有的每个业务规则创建一个不同的异常类吗?因为这就是我现在正在做的事情,这会产生两个问题:一个非常长的文件充满异常,最糟糕的是一个很长的 try catch catch catch (等等)。我可以有 100 个不同的业务规则。但它是否比使用通用但仍然自定义的 BusinessRuleException 更好?
    • 在不知道错误类型的情况下很难说。正如@Wutz 所说,也许可以考虑结合使用异常类和枚举或其他指示。
    • 上下文。用户界面“知道”它正在添加一个东西。业务层“知道”它只是没有通过唯一性约束。结合这些,你会得到特定的错误,它们可能会映射到资源 ID。似乎您的例外情况过于具体。
    【解决方案2】:

    我最终得到了这两种解决方案的混合。所以我只使用一个类:BusinessRuleException。此类作为属性“规则”,它是我所有业务规则的枚举。

    当我的 UI 收到 BusinessRuleException 时,它可以捕获它,然后将“规则”与资源文件进行比较,并为用户获取友好消息。如果 UI 找不到翻译,它只会按原样发送规则。所以用户仍然有一个变化来了解发生了什么。

    它不喜欢针对每个不同的业务规则使用不同的异常解决方案,因为它最终会产生很多额外的代码,这无助于你理解你的类在做什么的真正工作。

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2022-10-13
      • 1970-01-01
      • 2012-12-28
      • 2020-01-07
      • 2015-08-17
      • 2015-06-06
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多