现在的位置: 首页 > 综合 > 正文

【讨论】WF中的异常(错误)处理

2011年01月28日 ⁄ 综合 ⁄ 共 766字 ⁄ 字号 评论关闭
本人最近一直在作WF相关的一些工作,遇到一些问题和经验和大家分享和讨论,这次问题集中在异常处理上。
据我了解在WF中,一旦流程实例被开始,无论它的运行是正确的,还是错误的;也不论是系统性错误,还是业务性错误,该实例状态最终会被迁移到Closed状态,并被序列化。当然,其中可能会引发错误事件、取消事件或是补偿性事件。
如此一来就会有一个重大的问题,即
有些异常是可以人工修正的,极端的例子是我们在Debug过程中。而WF不论什么情况都会进入它预设的错误处理流程,最后还会Closed这个实例,以致于一旦有异常,即便我修正了问题,也得重新来过,这点让我很头痛。
我需要的是,有些情况的异常,可以通过认为修正而重新来过,实例数据不会被保存,也不需要补偿之类的;而有些情况则需要现WF的处理方式。
那么如果来实现呢?
我的做法是建立自己独立的异常处理机制,来区分WF预设的方式,两者方式并存。
具体方式如下:
1、我在原先已建立了所有活动的基类中建立Exception属性,作为运行时属性;
2、当有可以重新修正的异常发生(无论是系统性的还是业务性的),都设置此属性,并立即Close该活动;
3、其父活动检测到其Exception属性被赋值也会Close自己,直到根活动;
4、最后会引发序列化服务的开始,这时必须自定义序列化服务,并在Save方法中检测根活动的Exception属性是否被赋值,如果是则忽略序列化动作,并记录异常。
上述方式实现十分简单,使用也较灵活,但是如果你使用WF默认的层次状活动,则异常的传递会非常吃力,而使用我前一篇线性方式,则只需要传递一层即可。

PS:这种方式还有个问题就是需要在所有方法中加入try...catch快捕获异常并设置基类属性,否则还是会进入WF预设方式,这点十分头疼,如果有人知道如何来避免这点,请不吝赐教,谢谢!

【上篇】
【下篇】

抱歉!评论已关闭.