0
0
mirror of https://github.com/vim/vim.git synced 2025-10-03 05:14:07 -04:00

patch 9.1.0529: silent! causes following try/catch to not work

Problem:  silent! causes following try/catch to not work
          (Malcolm Rowe)
Solution: consider emsg_silent in handle_did_throw() and do not abort
          evaluation flow for :silent! (LemonBoy)

The silent! flag causes the evaluation not to be aborted in case of
uncaught exceptions, adjust handle_did_throw to take this detail into
account.

Fixes the long-standing todo.txt item:
```
Problem that a previous silent ":throw" causes a following try/catch not
to work. (ZyX, 2013 Sep 28) With examples: (Malcolm Rowe, 2015 Dec 24)
Also see #8487 for an example.
```

fixes: #538
closes: #15128

Signed-off-by: LemonBoy <thatlemon@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
LemonBoy
2024-07-04 19:23:16 +02:00
committed by Christian Brabandt
parent 11d5992573
commit 749ba0f6d9
4 changed files with 35 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
*todo.txt* For Vim version 9.1. Last change: 2024 Jun 03 *todo.txt* For Vim version 9.1. Last change: 2024 Jul 04
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -512,10 +512,6 @@ Information for a specific terminal (e.g. gnome, tmux, konsole, alacritty) is
spread out. Make a section with copy/paste examples of script and pointers to spread out. Make a section with copy/paste examples of script and pointers to
more information. more information.
Problem that a previous silent ":throw" causes a following try/catch not to
work. (ZyX, 2013 Sep 28) With examples: (Malcolm Rowe, 2015 Dec 24)
Also see #8487 for an example.
Request to use "." for the cursor column in search pattern \%<.c and \%<.v. Request to use "." for the cursor column in search pattern \%<.c and \%<.v.
(#8179) (#8179)

View File

@@ -1460,8 +1460,13 @@ handle_did_throw(void)
current_exception->throw_name = NULL; current_exception->throw_name = NULL;
discard_current_exception(); // uses IObuff if 'verbose' discard_current_exception(); // uses IObuff if 'verbose'
suppress_errthrow = TRUE;
force_abort = TRUE; // If "silent!" is active the uncaught exception is not fatal.
if (emsg_silent == 0)
{
suppress_errthrow = TRUE;
force_abort = TRUE;
}
if (messages != NULL) if (messages != NULL)
{ {

View File

@@ -7536,6 +7536,31 @@ func Test_deeply_nested_source()
call system(cmd) call system(cmd)
endfunc endfunc
func Test_exception_silent()
XpathINIT
let lines =<< trim END
func Throw()
Xpath 'a'
throw "Uncaught"
" This line is not executed.
Xpath 'b'
endfunc
" The exception is suppressed due to the presence of silent!.
silent! call Throw()
try
call DoesNotExist()
catch /E117:/
Xpath 'c'
endtry
Xpath 'd'
END
let verify =<< trim END
call assert_equal('acd', g:Xpath)
END
call RunInNewVim(lines, verify)
endfunc
"------------------------------------------------------------------------------- "-------------------------------------------------------------------------------
" Modelines {{{1 " Modelines {{{1
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
529,
/**/ /**/
528, 528,
/**/ /**/