【问题标题】:Does anything bad happen when throwing from validateValueCallback?从 validateValueCallback 抛出时会发生什么不好的事情吗?
【发布时间】:2013-08-11 09:05:45
【问题描述】:

注册依赖属性时,可以使用overload of Register that accepts a validation callback

如果验证回调为某个值返回 false,则将该值分配给依赖项属性将失败,并且将抛出 ArgumentException,抱怨无效的属性值。

现在,虽然ArgumentException 在某些情况下是合适的类型,但在某些情况下应该使用一些特殊的异常类型。特别是,我声明了一个enum 类型的属性,处理不受支持的值的正确方法是抛出InvalidEnumArgumentException。更重要的是,我正在实现一个接口,该接口将 enum 属性显示为 CLR 属性,并且在该属性的 doc cmets 中,需要为无效值抛出 InvalidEnumArgumentException

我看到的三个解决方案是:

  • 更改接口文档以允许更通用的异常类型。 这是不整洁的,我认为作为“解决方案”是不可接受的,因为它违背了拥有和记录专门的异常类型的目的。否则,我也可以在我的文档中的任何位置写 Exception,然后让 API 用户猜测和/或尝试实际抛出哪个。
  • 从使用依赖属性注册的验证值回调返回false(因此在通过SetValue更改属性值时会导致ArgumentException,并在CLR属性包装器的设置器中抛出InvalidEnumArgumentException。由于不同的原因,这是不整洁的,因为 CLR 属性包装器不应该包含任何它们自己的逻辑,除了调用 GetValue/SetValue。让依赖属性本身的行为与访问它时不同似乎不一致通过其 CLR 属性设置器。
  • 在验证值回调中抛出InvalidEnumArgumentException,而不是返回false这是我现在使用的解决方案。

我已经尝试了第三种解决方案,它似乎有效。唯一的缺点可能是丢失了默认的异常消息,不过这似乎是较小的邪恶。

我的问题是:像这样从验证值回调中抛出是否有任何我不知道的副作用,这会让我(或者更确切地说,我的代码)陷入困境?

【问题讨论】:

    标签: .net wpf dependency-properties


    【解决方案1】:

    我认为您可以从验证回调中抛出更具体的异常。只是反映了 WPF 代码,它看起来像这样的伪代码:

    if (!validateValueCallback(newValue))
        throw new ArgumentException();
    

    所以,如果您的验证回调抛出,我看不出它会如何导致任何问题。

    【讨论】:

    • 实际的代码看起来要复杂得多,但它确实归结为您编写的内容,在引发异常的情况下没有任何具体的预防措施。所以,这样检查是个好主意,接受:-)
    • +1 感谢安倍。 MSDN 声明 here 说“如果验证回调被任何这些操作调用,并返回 false,那么将引发异常。”但它没有说明引发了什么类型的异常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2013-03-01
    • 1970-01-01
    • 2010-12-12
    • 2014-01-19
    • 2011-02-05
    相关资源
    最近更新 更多