Verwendung eines COM-Proxys
Wenn man fehlerhafte Schreibweisen nicht erst in der Verwendung einer geschachtelten Funktion finden möchte (Wichtiges zur Verwendung von COM-Objekten), kann man Proxys verwenden. Technisch betrachtet bekommt jedes COM-Objekt als __proto__
ein Proxy-Objekt. Dieses generiert in seinem get
-Handler einen Fehler, falls eine Property angesprochen wird, die weder im COM-Objekt noch in der JavaScript-Klasse Object
vorhanden ist.
Der Pseudo-Code dazu lautet wie folgt:
Code
let PropertyChecker = new Proxy({}, {
get(target, propKey, receiver) {
if (!(propKey in target)) {
throw new ReferenceError('Unknown property: '+propKey);
}
return Reflect.get(target, propKey, receiver);
}
});
FSO.__proto__ = PropertyChecker;
In diesem Fall wird ein Fehler generiert, wenn eine nicht vorhandene Property lesend angesprochen wird. Damit ändert die Verwendung des Proxys nun die Fehlermeldung, insbesondere die gemeldete Fehlerstelle:
Code
rc.settings.UseProxy = true;
const WSH = new rc.com.ActiveXObject("WScript.Shell");
rc.console.log("WSH.CurrentDirectory => " + WSH.CurrentDirectory);
try {
rc.console.log("WSH.currentDirectory => " + WSH.currentDirectory);
} catch (e) {
rc.console.log(e);
}
Output
WSH.CurrentDirectory => D:\dvp\AS1010\kern-module\oxv8\oxv8test
Error: Property 'currentDirectory' is not defined
Ob ein Proxy verwendet wird oder nicht, kann in oxv8.cfg
per UseProxy = 0/1
eingestellt werden:
[Params]
UseProxy = 1
ProxyAllowedNames = toJSON;Symbol.toPrimitive;Symbol.iterator
Außerdem kann diese Einstellung innerhalb des Skripts ebenfalls durch rc.settings.UseProxy = true/false;
übersteuert bzw. geändert werden.
Dabei wird bei allen nicht existierenden Propertys dieses COM-Objekts ein Fehler generiert. Manche Bibliotheken (inkl. v8 selbst) prüfen das Vorhandensein von bestimmten Propertys per get
anstatt per has
, z. B. if (o.x == undefined){...}
anstatt if (o.has(x)) {...}
. Das führt zu Problemen, weil in diesem Fall eine unerwünschte Ausnahme aus dem Proxy geworfen wird. Dies geschieht beispielsweise in JSON.stringify(o)
: Hier wird (mit get
) geprüft, ob o.toJSON
vorhanden ist. Deswegen sollten in oxv8.cfg per ProxyAllowedNames = ...
solche Propertys aus der Prüfung ausgeschlossen werden. Dieses wäre allerdings lediglich bei der Verwendung der COM-Objekte in Fremdbibliotheken zu erwarten, daher sollte durch diese Erleichterung bei der Fehlerbehandlung normalerweise keine Spezialbehandlung der Liste von erlaubten Proxy-Namen nötig sein.