Как программно остановить выполнение в Vimscript? - PullRequest
4 голосов
/ 20 октября 2011

Я пытаюсь поймать исключение в Vimscript и остановить выполнение в функции, где происходит ошибка. Я могу уловить ошибку, но функция, в которой это происходит, находится на несколько уровней ниже в стеке вызовов, поэтому все, что происходит, - это еще одна ошибка в вызывающей функции. Сообщение об ошибке, которое я поместил в 'catch' оригинальной функции, никогда не появляется, и в вызывающей функции генерируется обычная ошибка Vim. Я могу поставить try / catches на всем пути вверх по цепочке, но похоже, что я должен быть в состоянии остановить выполнение прямо там, где это происходит.

Вот пример, иллюстрирующий, что я имею в виду:

function Function1()
     call Function2()
endfunction

function Function2()
     call Function3()
endfunction

function Function3()
    try
       [...]
    catch
       echo "An error occurred.  Execution should be stopped . . ."
       " I've tried putting 'normal <ctrl-C>' but it doesn't seem to 
       " do anything. . .  Execution silently goes back to function2, 
       " where another (uncaught) error occurs
    endtry
endfunction

1 Ответ

4 голосов
/ 20 октября 2011

Если я вас правильно понял, вы хотите прервать выполнение, если в какой-то функции есть ошибка, но вместо обычного вывести сообщение об ошибке. В этом случае вы должны использовать throw, попробуйте заменить :echo в блоке :catch на него. Вы также можете использовать следующий хак, чтобы сохранить сообщение об ошибке vim и показать свое сообщение:

function Function3()
    try
        [...]
        let succeeded=1
    finally
        if !exists('succeeded')
            echo "An error occurred.  Execution should be stopped . . ."
        endif
    endtry
endfunction

Кстати, правильный синтаксис для использования специальных ключей в :normal - :execute "normal! \<C-c>", а не :normal! <Ctrl-c>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...