2010-07-19 67 views
0

我遇到了一個覆蓋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中)

回答

1

IMO它沒有意義通過設計從put方法拋出異常即JS代碼可以」捕捉。我認爲在設置一個屬性時拋出一個例外是很好的,雖然不常見。請注意,JS代碼可以使用拋出的自定義setter輕鬆重新配置屬性(在ECMAScript 5中)。

另一方面,如果屬性getter引發異常,我認爲這將是相當令人驚訝的。

+0

謝謝。 你能指點我一個關於ECMA腳本5中的自定義setter的相關資源嗎? – 2010-08-02 10:35:11

+0

另外,我認爲在ecma 5之前,沒有辦法攔截屬性訪問,所以只有主機對象可以在屬性訪問中拋出異常。使用純JS代碼創建的對象不會在屬性訪問中拋出異常? – 2010-08-02 10:38:58

+1

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

相關問題