在Rhino的JS属性赋值中抛出异常是否有意义?

时间:2010-07-19 17:09:30

标签: java javascript exception-handling rhino

我遇到了一个设计,它覆盖了ScriptableObject的子类中的[Scriptable.put] [1]来进行一些转换。如果转换失败,代码将抛出异常。这意味着像以下代码这样的属性赋值可能会导致抛出运行时异常

    aScriptable.dateOfArrival = aVar;

默认情况下,rhino不会让脚本捕获[Scriptable.put] [1]期间抛出的运行时异常。因此,以下代码中的catch块将永远不会运行:

    try{    
      aScriptable.dateOfArrival = aVar;
    }catch(e){
    //will not run even if above assignment generates an exception. Script will be terminated instead
    }

使用以下代码覆盖ContextFactory.hasFeature()会使上面的catch块工作:

    protected boolean hasFeature(Context cx, int featureIndex) {
      if(featureIndex == Context.FEATURE_ENHANCED_JAVA_ACCESS){
        return true;
      }
      return super.hasFeature(cx, featureIndex);
    }

我的问题是,使属性赋值抛出异常的设计决策是否正确或属性赋值是否永远不会抛出异常?

[1]:http://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/Scriptable.html#put(java.lang.String,org.mozilla.javascript.Scriptable,java.lang.Object)

1 个答案:

答案 0 :(得分:1)

IMO根据JS代码无法捕获的put方法设计异常是没有意义的。我认为在设置房产时抛出异常是好的,尽管不常见。请注意,JS代码可以使用抛出的自定义setter轻松地重新配置属性(在ECMAScript 5中)。

另一方面,我认为如果属性getter抛出异常会非常令人惊讶。