Plugins:NPN SetExceptionVariant
Contents
Status
Under consideration.
Background
Unlike JavaScript the current NPN_SetException[1] call does not allow to throw custom objects or plain JS types as exceptions from a plugin. Hence the NPN_SetException limits scriptable objects to just throwing errors with a defined message property.
Current Proposal
- Last modified: July 14, 2009
- Author: Anselm R Garbe, Aplix Corporation
- Contributors:
NPN_SetExceptionVariant
One possible solution to this limitation is the introduction of a new function call to trigger script exceptions as follows:
void NPN_SetExceptionVariant(NPObject *npobj, const NPVariant *ex);
The semantics of NPN_SetExceptionVariant remain similiar to NPN_SetException, though the NPN_SetExceptionVariant call triggers a script exception upon return from entry points into 'npobj' where the given object thrown is the value of 'ex'. Such a variant value may be a custom object exposing properties, methods and type information that extends the typical 'message' only approach and enables more fine-grain and language-independent exception handling in JavaScript.
An Example
bool SomeClass::invokeDefault(NPObject *npObj, const NPVariant *args, uint32_t argCount, NPVariant *result) { static NPVariant v; NPObject *ob; if(createCustomErrorObject(&ob) == NoError) { NPN_RetainObject(ob); OBJECT_TO_NPVARIANT(ob, v); NPN_SetExceptionVariant(npObj, &v); return false; } INT32_TO_NPVARIANT(0, *result); return true; }
Legacy APIs
The proposed NPAPI extension works well with legacy APIs, because it doesn't attempt to change NPN_SetException but introduces an alternative call instead.