【问题标题】:Handing exception in BLL and return to client (either winforms or webforms)?在 BLL 中处理异常并返回给客户端(winforms 或 webforms)?
【发布时间】:2009-04-28 22:50:31
【问题描述】:

我正在寻找进行异常处理的最佳方式,例如..当业务逻辑层发生错误时,使用 catch 停止 METHOD 并向表示层返回 EVENT 的最佳方式是什么?

这个事件应该包含什么?

或者我应该总是冒泡异常并在表示层中处理它们?

关于处理异常的最佳方式以及如何在客户端处理它们,任何人都有一些很好的链接和需要阅读的内容...

例如,如果我在 BLL 中得到一个 NullException,那么我可以捕捉到这个.. 但是最好的方法是返回到 presentaiton 层并通知它这个问题..

事件?还是演示文稿中的另一个尝试/捕获?

【问题讨论】:

    标签: winforms exception exception-handling try-catch


    【解决方案1】:

    你可以做几件事;

    1. 当出现意外错误时,专注于改善用户体验。

    2. 始终在事件日志或数据库中记录错误。

    3. 实施足够的基础架构,以防止异常发生,除非它们是系统异常。

    4. 使用 throw instread 的 throw 异常

    一些链接可以帮助你

    1. http://today.java.net/pub/a/today/2003/12/04/exceptions.html

    2. http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

    3. http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

    【讨论】:

      【解决方案2】:

      有几种方法可以做到:

      1) 抛出带有描述消息的异常。

      2) 触发事件

      3) 使用特殊接口与用户交互。
      例如,您可以实现类似 IUiCallbacks 接口的东西,并将实现此接口的对象发送到 BLL 类或方法。之后,BLL 中的方法可以调用 IUiCallbacks.SendMessage() 或 IUiCallbacks.SendError() 来通知演示。并且你可以有不同的类,例如 WinFormsUiCallbacks、WebFormsUiCallbacks 和 SilentUiCallbacks,来实现这个接口。

      我通常使用 1) 和 3)

      根据要求提供示例 3):

      public interface IUiCallbacks
      {
        void SendMessage(string message);
        void SendException(string message, Exception ex);
      }
      
      public class WinFormsUiCallbacks : IUiCallbacks
      {
        public void SendMessage(string message)
        {
          MessageBox.Show(message);
        }
      
        public void SendException(string message, Exception ex)
        {
          MessageBox.Show(string.Format("Unfortunately, the following errror has occurred:{0}{1}", Environment.NewLine, ex.Message));
        }
      }
      
      public class OrderService
      {
        private IUiCallbacks _iUiCallbacks;
        ...
        public OrderService() { ... }
        public OrderService(IUiCallbacks iUiCallbacks)
        {
          _iUiCallbacks = iUiCallbacks;
        }
        ...
        public void AddOrder(Order order)
        {
          ...
          if(OrderAlreadyExists(order))
          {
            if(_iUiCallbacks != null)
              _iUiCallbacks.SendMessage("The order can not be added, because it is already accepted.");
            return;
          }
          ...
        }
        ...
      }

      所以可以这样使用:

      public partial class OrderForm : Form
      {
        ...
        public void btnAddOrderFromExcel_Click(...)
        {
          Order order = LoadOrderFromExcel(...);
          OrderService orderService = new OrderService(new WinFormsUiCallbacks());
          orderService.AddOrder(order);
        }
        ...
      }
      

      【讨论】:

      • 嗨,感谢您的回复。是的,非常好!当您说回调时,我希望听到有关 number3 的更多信息。事件没有?有示例代码吗?
      • 我将示例添加到我的答案中。
      猜你喜欢
      • 2010-11-29
      • 2015-08-18
      • 2017-04-08
      • 2019-07-27
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2019-11-09
      相关资源
      最近更新 更多