我遇到了一個覆蓋ScriptableObject的子類[Scriptable.put] [1]做一些轉換的設計。如果轉換失敗,代碼將拋出異常。這意味着,屬性分配像下面的代碼會導致運行時異常被拋出在Rhino中引發JS屬性賦值異常是否合理?
aScriptable.dateOfArrival = aVar;
默認犀牛不會讓腳本趕在[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中)
謝謝。 你能指點我一個關於ECMA腳本5中的自定義setter的相關資源嗎? – 2010-08-02 10:35:11
另外,我認爲在ecma 5之前,沒有辦法攔截屬性訪問,所以只有主機對象可以在屬性訪問中拋出異常。使用純JS代碼創建的對象不會在屬性訪問中拋出異常? – 2010-08-02 10:38:58
ECMAScript 5規範的PDF文件位於http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf。使用Object.defineProperty()是你如何用自定義setter定義一個屬性。 根據ECMAScript第3版,您是正確的,本地對象無法拋出設置屬性。 – heycam 2010-08-04 23:56:56