2010-07-19 1 views
0

J'ai rencontré une conception qui remplace [Scriptable.put] [1] dans une sous-classe de ScriptableObject pour effectuer une conversion. Si la conversion échoue, le code émet une exception. Ce qui signifie que les affectations de propriété comme code suivant peut provoquer une exception d'exécution d'être jetéL'exception de lancement dans l'affectation de propriété JS dans Rhino est-elle logique?

aScriptable.dateOfArrival = aVar; 

Rhino par défaut ne serait pas laisser le script attraper une exception d'exécution lancée au cours de [Scriptable.put] [1]. Donc bloc catch dans le code suivant ne fonctionnera jamais:

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

Redéfinition ContextFactory.hasFeature() avec le code suivant rend le travail de bloc catch ci-dessus:

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

Ma question est que si la décision de la conception à faire exception cession des biens throw est correcte ou les affectations de propriété ne sont jamais censées jeter des exceptions?

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

Répondre

1

l'OMI, il n'a pas de sens de lancer une exception par la conception de la méthode put que le code JS peut » t attraper. Je pense que lancer une exception sur la définition d'une propriété est bien, mais pas si commun. Notez que le code JS peut facilement reconfigurer une propriété (dans ECMAScript 5) avec un setter personnalisé qui se déclenche. D'autre part, je pense qu'il serait assez surprenant si un getter de propriété lève une exception.

+0

Merci. Pouvez-vous me diriger vers une ressource pertinente sur les setters personnalisés dans ECMA script 5? –

+0

En outre, je pense qu'avant ecma 5, il n'y avait pas moyen d'intercepter l'accès aux propriétés, donc seuls les objets hôtes pouvaient rejeter une exception dans l'accès aux propriétés. Les objets créés avec du code JS pur ne lèveraient jamais d'exception sur l'accès à la propriété? –

+1

Le fichier PDF de la spécification ECMAScript 5 est disponible à l'adresse http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf. Utiliser Object.defineProperty() est comment vous pouvez définir une propriété avec un setter personnalisé. Vous avez raison: selon la 3e édition d'ECMAScript, les objets natifs ne peuvent pas lancer sur les propriétés de définition. – heycam

Questions connexes