EjsVar *ejsCreateException(Ejs *ejs, int slot, cchar *fmt, va_list fmtArgs) { EjsType *type; EjsVar *error; char *buf; if (ejs->exception) { buf = mprVasprintf(ejs, 0, fmt, fmtArgs); mprError(ejs, "Double exception: %s", buf); mprFree(buf); return ejs->exception; } if (!ejs->initialized || (ejs->flags & EJS_FLAG_EMPTY)) { buf = mprVasprintf(ejs, 0, fmt, fmtArgs); mprError(ejs, "Exception: %s", buf); mprFree(buf); return ejs->exception; } type = (EjsType*) ejsGetProperty(ejs, ejs->global, slot); if (type == 0) { type = ejs->errorType; } error = createException(ejs, type, fmt, fmtArgs); if (error) { ejsThrowException(ejs, error); } return error; }
EjsAny *ejsCreateException(Ejs *ejs, int slot, cchar *fmt, va_list fmtArgs) { EjsType *type; EjsAny *error; if (ejs->exception) { mprLog("ejs vm", 0, "Double exception: %s", sfmtv(fmt, fmtArgs)); return ejs->exception; } type = (ejs->initialized) ? ejsGetProperty(ejs, ejs->global, slot) : NULL; if (type == 0) { type = EST(Error); } error = createException(ejs, type, fmt, fmtArgs); if (error) { ejsThrowException(ejs, error); } return error; }
EjsVar *ejsCreateException(Ejs *ejs, int slot, cchar *fmt, va_list fmtArgs) { EjsType *type; EjsVar *error; char *buf; #if DEBUG_IDE mprBreakpoint(0, 0); #endif mprAssert(ejs->exception == 0); if (ejs->exception) { mprAllocVsprintf(ejs, &buf, 0, fmt, fmtArgs); mprError(ejs, "Double exception: %s", buf); return ejs->exception; } if (!ejs->initialized || (ejs->flags & EJS_FLAG_EMPTY)) { mprAllocVsprintf(ejs, &buf, 0, fmt, fmtArgs); mprError(ejs, "Exception: %s", buf); return ejs->exception; } type = (EjsType*) ejsGetProperty(ejs, ejs->global, slot); if (type == 0) { type = ejs->errorType; } error = createException(ejs, type, fmt, fmtArgs); if (error) { ejsThrowException(ejs, error); } return error; }
/* Get the current exception error. May be an Error object or may be any other object that is thrown. Caller must NOT free. */ cchar *ejsGetErrorMsg(Ejs *ejs, int withStack) { EjsString *str, *tag, *msg, *message; EjsAny *stack, *error, *saveException; char *buf, *stackStr; error = ejs->exception; message = 0; stack = 0; tag = NULL; if (error) { tag = TYPE(error)->qname.name; if (ejsIs(ejs, error, Error)) { message = ejsGetProperty(ejs, error, ES_Error_message); if (withStack && ejs->initialized && ejs->state) { saveException = ejs->exception; ejsClearException(ejs); stack = ejsRunFunctionBySlot(ejs, error, ES_Error_formatStack, 0, NULL); ejsThrowException(ejs, saveException); } } else if (ejsIs(ejs, error, String)) { tag = ejsCreateStringFromAsc(ejs, "Error"); message = (EjsString*) error; } else if (ejsIs(ejs, error, Number)) { tag = ejsCreateStringFromAsc(ejs, "Error"); message = (EjsString*) error; } else if (error == EST(StopIteration)) { message = ejsCreateStringFromAsc(ejs, "Uncaught StopIteration exception"); } } if (message == ESV(null) || message == 0) { msg = ejsCreateStringFromAsc(ejs, "Exception"); } else{ msg = ejsToString(ejs, message); } if (ejsIs(ejs, error, Error)) { stackStr = (stack) ? ejsToMulti(ejs, stack) : 0; if (stackStr && *stackStr) { buf = sfmt("%@: %@\nStack:\n%s", tag, msg, (stack) ? ejsToMulti(ejs, stack) : ""); } else { buf = sfmt("%@: %@", tag, msg); } } else if (message && ejsIs(ejs, message, String)){ buf = sfmt("%@: %@", tag, msg); } else if (message && ejsIs(ejs, message, Number)){ buf = sfmt("%@: %g", tag, ((EjsNumber*) msg)->value); } else if (error) { EjsObj *saveException = ejs->exception; ejs->exception = 0; str = ejsToString(ejs, error); buf = sclone(ejsToMulti(ejs, str)); ejs->exception = saveException; } else { buf = sclone(""); } ejs->errorMsg = buf; return buf; }
/* * Throw the StopIteration object */ EjsVar *ejsThrowStopIteration(Ejs *ejs) { return ejsThrowException(ejs, (EjsVar*) ejs->stopIterationType); }