从validateValueCallback中抛出异常是否有什么不良后果?

3

在注册依赖属性时,可以使用接受验证回调函数的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 回调函数中这样抛出异常是否会产生我不知道的副作用并让我(或者说我的代码)陷入麻烦?
1个回答

1
我认为你可以在验证回调函数中抛出更具体的异常。仅仅反射 WPF 代码,看起来像这样的伪代码:
if (!validateValueCallback(newValue))
    throw new ArgumentException();

因此,如果您的验证回调函数抛出异常,我无法看到它会引起任何问题。

实际代码看起来比那复杂得多,但归根结底,它确实与您所写的相同,没有在抛出异常的情况下采取任何特定的预防措施。因此,像那样进行检查是个好主意,已经接受了 :-) - O. R. Mapper
+1 谢谢你的分享,Abe。MSDN在这里指出:“如果验证回调被任何操作调用并返回false,则会引发异常。”但它没有说明引发的是哪种类型的异常! - The Lonely Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接