2017-11-04 2 views
1

Ich beginne die Arbeit mit Nodejs Addons mit Nan und lese über MaybeLocal. Die Dokumentation sagt "Wenn eine API-Methode ein MaybeLocal <> zurückgibt, kann die API-Methode möglicherweise fehlschlagen, entweder weil eine Ausnahme ausgelöst wird oder eine Ausnahme aussteht, z. B. weil ein vorheriger API-Aufruf eine Ausnahme ausgelöst hat. Wurde noch nicht abgefangen oder wurde eine TerminateExecution-Ausnahme ausgelöst. In diesem Fall wird ein leeres MaybeLocal zurückgegeben. "Was bedeutet "ein leerer MaybeLocal"?

Ist das ungefähr das Zurückgeben eines Nullzeigers, aber mit einer einfachen Klasse, die das erkennen kann?

Antwort

2

(V8-Entwickler hier.) Ja, ein "leeres MaybeLocal" ist im Wesentlichen ein Zeiger, der nullptr sein kann und zwingt den Code, für diesen Fall zu überprüfen. Der Hintergrund ist, dass aufgrund der Art von JavaScript viele der V8-API-Operationen (etwas unerwartet) fehlschlagen können: Wenn JavaScript ausgeführt wird, kann JavaScript-Code eine Ausnahme auslösen. Selbst das Lesen einer Objekteigenschaft könnte einen Getter aufrufen. Wir haben aus Erfahrung gelernt, dass es extrem schwierig ist, Client-Code zu schreiben, der für alle diese korrekt überprüft, so dass V8s API heutzutage meistens auf MaybeLocal s basiert, die Ihnen helfen, alle Orte zu finden, die nullptr Schecks oder .IsEmpty() Schecks benötigen werden in der MaybeLocal Welt genannt.

In Fällen, in denen Sie garantieren können, dass eine MaybeLocal nicht leer sein kann, können Sie .ToLocalChecked() verwenden, die abstürzen wird, wenn die MaybeLocal leer war. Ansonsten ist ein übliches Muster:

Local<Value> value; 
if (maybe_value.ToLocal(&value)) { 
    // Do stuff with {value}. 
} else { 
    // Handle error. If you have a TryCatch, it should 
    // have caught an exception. 
} 
+0

Ich schätze die Hintergrunderklärung. Ich finde, das ist das Schwierigste. Es gibt eine Menge Code zu lesen, aber nicht viel "Hier ist, warum es so gemacht wird". – bmacnaughton