call delete('XTest_silent_echo')
endfunc
+def SilentlyError()
+ execute('silent! invalid')
+ g:did_it = 'yes'
+enddef
+
+"func UserError()
+" silent! invalid
+"endfunc
+"
+"def SilentlyUserError()
+" UserError()
+" g:did_it = 'yes'
+"enddef
+
+" This can't be a :def function, because the assert would not be reached.
+" And this must not be inside a try/endtry.
+func Test_ignore_silent_error()
+ let g:did_it = 'no'
+ call SilentlyError()
+ call assert_equal('yes', g:did_it)
+
+" this doesn't work yet
+" let g:did_it = 'no'
+" call SilentlyUserError()
+" call assert_equal('yes', g:did_it)
+
+ unlet g:did_it
+endfunc
+
def Fibonacci(n: number): number
if n < 2
return n
{
typval_T argvars[MAX_FUNC_ARGS];
int idx;
- int called_emsg_before = called_emsg;
+ int did_emsg_before = did_emsg;
ectx_T *prev_ectx = current_ectx;
if (call_prepare(argcount, argvars, ectx) == FAIL)
for (idx = 0; idx < argcount; ++idx)
clear_tv(&argvars[idx]);
- if (called_emsg != called_emsg_before)
+ if (did_emsg != did_emsg_before)
return FAIL;
return OK;
}
msglist_T *private_msg_list = NULL;
cmdmod_T save_cmdmod;
int restore_cmdmod = FALSE;
+ int trylevel_at_start = trylevel;
// Get pointer to item in the stack.
#define STACK_TV(idx) (((typval_T *)ectx.ec_stack.ga_data) + idx)
continue;
on_error:
- if (trylevel == 0)
+ // If we are not inside a try-catch started here, abort execution.
+ if (trylevel <= trylevel_at_start)
goto failed;
}