在注册依赖属性时,可以使用接受验证回调函数的Register
重载方法。
如果该验证回调函数对于某个值返回false
,则将该值分配给依赖属性将失败,并且将抛出一个ArgumentException
,指示无效的属性值。
现在,虽然在某些情况下ArgumentException
是适当的类型,但在某些特定的情况下应使用一些专门的异常类型。特别是,我正在声明一个enum
类型的属性,对于该属性处理不支持的值的正确方式是抛出InvalidEnumArgumentException
。而且,我正在实现一个将该enum
属性作为CLR属性展示的接口,并且在该属性的文档注释中,要求对于无效的值抛出InvalidEnumArgumentException
。
我看到的三种解决方案是:
- 更改接口文档以允许更通用的异常类型。这样做不太整洁,我认为这是不可接受的“解决方案”,因为它破坏了有专门的异常类型并记录下来的目的。否则,我可以在我的文档中随处写
Exception
,让API用户猜测和/或尝试哪一个实际上会被抛出。 - 从注册到依赖属性的验证值回调中返回
false
(因此在通过SetValue
更改属性值时引发ArgumentException
,并在CLR属性包装器的setter中引发InvalidEnumArgumentException
)。这是由于CLR属性包装器不应该包含任何自己的逻辑,除了调用GetValue
/SetValue
,所以这样做不太整洁。似乎让依赖属性本身的行为与通过其CLR属性设置器访问时不同看起来不一致。 - 在验证值回调中抛出
InvalidEnumArgumentException
而不是返回false
。 这是我现在正在使用的解决方案。
我的问题是:从 validate value 回调函数中这样抛出异常是否会产生我不知道的副作用并让我(或者说我的代码)陷入麻烦?