枚举导致的WCF Web Service接口返回异常

枚举在dotNet中是一个比较特别的类型,因为你可以将任意整数赋值给一个枚举类,而不会导致编译或者运行时异常。

不知道为什么要这样设计,感觉在这样的设计下,枚举类就变成弱类型了,丧失了类型安全检测了。

曾经有一次在项目中遇到了和枚举类这个设计相关的奇怪问题,调试了半天才解决。



当时的症状是这样的,客户端程序在调用Web Service返回的时候抛出了一个CommunicationException,这个错误没能提供任何信息,把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下,发现程序正常的走到最后一个大括号,没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。


Google了一下,实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后,还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁,后来终于想起了一丝线索,就是某个类里面定义了一个枚举成员,这个枚举类我之前修改过。我回想起当时的修改,我是把一个成员给删掉了,但是这会有什么关系呢??我重新跟了一下,重点跟踪和该枚举成员相关的代码,终于发现了在一个数据库查询的时候,返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在,因此这里不会报错,代码会继续执行直到返回。但是Silverlight客户端Web Service代理在反射此类型的时候则会出错(因为没有对应的枚举成员存在)。遗憾的是Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现,如果在调用Web Service的时候传入一个非法的成员值,是会抛出一个反射类型出错的异常,而且会帮你定位到出错的那个枚举成员上。


在实例化一个类实例的时候,由于类中使用C#3.0的自动属性特性去定义的枚举成员,成员的初始值是0,而枚举类中并没有0的成员,所以会遇到和上面一样的问题。


实际上,微软给的最佳开发实践中指出了,枚举类的一个设计原则就是,一定要定义一个0值的成员,这样可以避免枚举初始化值无效的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值