【问题标题】:c# Exception handling in 3 tier win forms appc# 3 层 win forms 应用程序中的异常处理
【发布时间】:2011-07-04 05:42:25
【问题描述】:

我有一个 3 层的 win forms 应用程序,它有一个 UI、BLL 和 DAL。我希望添加一个异常处理程序,该处理程序将异常从 DAL 一直抛出到 UI,以便用户知道错误是什么。我曾尝试使用 try{} catch{} 并将其从 DAL 中抛出,但这只会将其抛出到 BLL 并停在那里。有什么办法可以将它直接扔回 UI?

谢谢

编辑:

代码:

http://pastebin.com/V75MDWdm

【问题讨论】:

  • 您能告诉我们您在 BLL 中的捕获代码吗?
  • @stecya:你有什么可以证明这一点的吗?
  • 或者,只是不要在 BLL 中使用 catch ...
  • 在您的代码中,BLL 重新抛出异常,是什么捕获了它?
  • @Funky,仅供参考:当您想“重新抛出”异常时,只需使用 throw;不要像你一样扔前任。我不太明白你的问题,但我想在看到你的代码后我会提到这一点。

标签: c# exception-handling n-tier-architecture


【解决方案1】:

每一层都应该将异常包装在一个稍微抽象一点的异常中。

以一个简单的客户登录操作为例:

  • DAL 在尝试加载“客户”记录时抛出“RecordNotFound”异常。
  • BLL 捕获它,并将其包装在“InvalidLogonRequest”异常中,表示未找到客户记录。
  • GUI 捕捉到这一点,并向用户显示一条错误消息,指出“客户”不存在。

UI 下方的每一层不一定知道正在进行的操作的更广泛的上下文,因此需要由上层提供有关问题所在的更多上下文信息...

也许一个更好的例子是客户注册操作:

  • DAL 在电子邮件地址列上引发 sql“UniqueConstraintException”。
    • DAL 可能不知道这是一个注册过程,它只知道它正在对客户表执行 INSERT...
  • BLL 捕捉到这一点,并引发“EmailAlreadyExists”异常。
  • GUI 捕捉到这一点,并向用户显示一条消息“电子邮件地址已被占用”

【讨论】:

  • 等一下,他说他的异常在 BLL 中“停止”了。然后他如何在 GUI 中捕获它?
  • 数据访问层的异常不应上升到表示层。数据异常确实在 BLL 中“停止”。但是 BLL 本身应该抛出一个更符合上下文的异常,GUI 应该捕获它。
  • 优秀,并使用 InnerException 将 'UniqueConstraintException' 存储在 BLL 中。适合调试/错误报告
【解决方案2】:

提供的代码似乎使用通用异常来关联错误。这可能是个坏主意,就像您在其他任何地方捕获任何异常一样,该代码也很容易在您不期望的情况下使用此异常。

我会为此特定错误指定一些自定义异常,并专门捕获/重新抛出这些异常。使用基类 Exception 只会导致不同地方的不同捕获之间的混淆。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2012-06-08
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多