Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception 如何在Vimscript中以编程方式停止执行?_Exception_Vim - Fatal编程技术网

Exception 如何在Vimscript中以编程方式停止执行?

Exception 如何在Vimscript中以编程方式停止执行?,exception,vim,Exception,Vim,我试图捕获Vimscript中的异常,并在发生错误的函数中暂停执行。我可以很好地捕捉错误,但是发生错误的函数在调用堆栈中处于较低的几个级别,因此发生的只是调用函数中发生的另一个错误。我在原始函数的“catch”中输入的错误消息从未被看到,并且在调用函数中会生成常规的Vim错误。我可以把try/catch放在整个链条的最上面,但似乎我应该能够在它发生的地方停止执行 下面是一个例子来说明我的意思: function Function1() call Function2() endfunct

我试图捕获Vimscript中的异常,并在发生错误的函数中暂停执行。我可以很好地捕捉错误,但是发生错误的函数在调用堆栈中处于较低的几个级别,因此发生的只是调用函数中发生的另一个错误。我在原始函数的“catch”中输入的错误消息从未被看到,并且在调用函数中会生成常规的Vim错误。我可以把try/catch放在整个链条的最上面,但似乎我应该能够在它发生的地方停止执行

下面是一个例子来说明我的意思:

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
函数Function1()
调用函数2()
端功能
函数Function2()
调用函数3()
端功能
功能3()
尝试
[...]
抓住
echo“发生错误。应停止执行…”
“我试着把‘正常’放进去,但似乎没有
“做任何事。执行会悄悄地返回到函数2,
“发生另一个(未捕获的)错误时
末日
端功能

如果我理解正确,您希望在某些函数出现错误时中止执行,但也会显示自定义错误消息,而不是默认错误消息。在这种情况下,您应该使用
throw
,尝试用它替换
:catch
块中的
:echo
。您还可以使用以下hack来保持im错误消息并显示您的错误消息:

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

顺便说一下,在
:normal
中使用特殊键的正确语法是
:execute“normal!”\“
,而不是
:正常!

返回一个合适的错误指示并退出怎么样?这是第一个想法,但有错误的函数是从代码中的多个函数调用的,因此需要在许多不同的位置更改代码。Zyx--谢谢,将尝试,但我认为它不会工作。调用函数取决于返回值,因此如果Function3()失败调用函数时肯定会生成错误,这将覆盖任何echo命令。可以修复调用函数本身,但实际上函数3是从代码中的多个位置调用的,在调用函数3的任何位置放入额外代码似乎都是不必要的工作。没什么大不了的,我只是想更友好、更少干扰的错误消息,我认为这很简单,但可能不是…ZyX--另一件事,似乎不可能让回显文本与常规Vim错误消息同时可见。错误消息以命令行中的“按下或输入命令继续…”消息结束。我的回显语句正在执行g执行时,输出被覆盖。@HerbertSitz如果Function3在这种情况下失败,它会抛出一个在任何其他级别都无法捕捉到的异常。如果用
throw
替换
echo
,在您的示例中,异常将属于您,如果您使用我的代码片段,它将保留vim生成的错误并转换为异常。我几乎只在致命故障时使用异常,所以我有一堆抛出和几乎没有
catch
块,我认为您也需要这些块。@HerbertSitz但是,是的,如果不生成一堆消息,比如
missing endif
,就无法中断所有底层函数的执行,而这些消息几乎不能被视为是朋友ly.
echo
语句在
finally
throw
inside
catch
@HerbertSitz从不使用
:echorr
。您会感到惊讶,因为类似这样的事情«我已经在一个:try块中调用了带有echorr的函数,但现在什么都不起作用»。您应该使用
:echomg>
(可能与周围的
:echohl
)或
:throw
:echoorr
在尝试调试我提到的错误时会给您带来痛苦。