ucode: write ucode runtime exceptions to stderr
Write unhandled exceptions in invoked ucode method handlers to stderr in order to simplify debugging failing scripts. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
e80d0b2d77
commit
8c852b656b
1 changed files with 18 additions and 0 deletions
18
ucode.c
18
ucode.c
|
@ -401,6 +401,7 @@ rpc_ucode_script_call(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
rpc_ucode_script_t *script = rpc_ucode_obj_to_script(obj);
|
rpc_ucode_script_t *script = rpc_ucode_obj_to_script(obj);
|
||||||
uc_value_t *func, *args = NULL, *reqobj, *reqproto, *res;
|
uc_value_t *func, *args = NULL, *reqobj, *reqproto, *res;
|
||||||
rpc_ucode_call_ctx_t *callctx;
|
rpc_ucode_call_ctx_t *callctx;
|
||||||
|
const char *extype;
|
||||||
size_t i;
|
size_t i;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
@ -499,6 +500,23 @@ rpc_ucode_script_call(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
|
||||||
/* treat other exceptions as unknown error */
|
/* treat other exceptions as unknown error */
|
||||||
default:
|
default:
|
||||||
|
switch (script->vm.exception.type) {
|
||||||
|
case EXCEPTION_SYNTAX: extype = "Syntax error"; break;
|
||||||
|
case EXCEPTION_RUNTIME: extype = "Runtime error"; break;
|
||||||
|
case EXCEPTION_TYPE: extype = "Type error"; break;
|
||||||
|
case EXCEPTION_REFERENCE: extype = "Reference error"; break;
|
||||||
|
default: extype = "Exception";
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ucv_object_get(
|
||||||
|
ucv_array_get(script->vm.exception.stacktrace, 0),
|
||||||
|
"context", NULL);
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"Unhandled ucode exception in '%s' method!\n%s: %s\n\n%s\n",
|
||||||
|
ubus_method_name, extype, script->vm.exception.message,
|
||||||
|
ucv_string_get(res));
|
||||||
|
|
||||||
ubus_complete_deferred_request(ctx, &callctx->req, UBUS_STATUS_UNKNOWN_ERROR);
|
ubus_complete_deferred_request(ctx, &callctx->req, UBUS_STATUS_UNKNOWN_ERROR);
|
||||||
callctx->replied = true;
|
callctx->replied = true;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue