[已解决问题] 讨论一个设计问题
提问时间: 2008-03-10 14:14
悬赏分:20 浏览:273 次

问题是这样的

我在我的一个通讯程序中,封装了一个UDP组件(其实无论任何组件都无所谓,关键是一个通讯底层),这个组件会监听某个指定的端口,监听到之后以 同步 形式将当前监听的数据向上层抛(事件绑定),上层处理事件时可能会抛出某个异常(业务上的)

由于是同步形式,上层抛出的异常直接就跳回到这个UDP组件里了

我的想法是上层的业务异常最好不要回到这个UDP组件里去处理

当前我有几个考虑:

  1. 上层处理事件时,在新线程里处理(底层组件还是以同步形式触发事件)
  2. UDP触发接收事件时,以异步形式抛出事件(但照样还是会有业务异常)

我看了一下m$在SerialPort类中抛出DataReceived事件的一段代码:

    private void CatchReceivedEvents(object src, SerialDataReceivedEventArgs e)
    {
        SerialDataReceivedEventHandler dataReceived = this.DataReceived;
        SerialStream internalSerialStream = this.internalSerialStream;
        if ((dataReceived != null) && (internalSerialStream != null))
        {
            lock (internalSerialStream)
            {
                bool flag = false;
                try
                {
                    flag = internalSerialStream.IsOpen && ((SerialData.Eof == e.EventType) || (this.BytesToRead >= this.receivedBytesThreshold));
                }
                catch
                {//这里没有任何处理
                }
                finally
                {
                    if (flag)
                    {
                  

提问者:micYng - 菜鸟二级

问题补充:晕,文字被截掉了
继续:
dataReceived(this, e);
}
}
}
}
}

我的想法是在底层还是以同步形式抛出,异步可能会导致事件链脱节,因为上层的用户业务编码习惯是无法预知的 :)
热烈欢迎讨论
btw.winform程序

所有回答(1)
我觉得M$的方式就可以了,毕竟是事件传递,需要保证事件全部传出去,而且如果顶层的异常需要处理应该会有相应的捕获。如果实在想要捕获到这个异常的话,可以使用类似Application.Error事件这样的方式。
3个月前   回答者:iamarabbit - 菜鸟二级
评论
3个月前   micYng :
倒是可以挂接一个全局的未捕获异常事件,但是那玩意只能捕获主线程里的异常,没多大用处

我现在的做法是在业务层可能抛异常的地方”就地正法“ :)try catch之后顺手将这个异常以友好形式抛到UI

欢迎继续讨论 :)
3个月前   micYng :
总觉得事件这个东西,耦合性还是满大滴
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除