问题 Vimscript:函数定义中“中止”的意义是什么?


在vimscript中, function 定义可以采取 abort 论据。引用文档,

When the [abort] argument is added, the function will
abort as soon as an error is detected

这使我严重质疑在遇到错误时通常会做什么功能。盲目地跌入黑暗中?

是什么 abort 实际上呢?它会破坏所有的 try...endtry 块?你什么时候想用它,什么时候想避免它?


9817
2017-11-16 22:55


起源

有一些具体的讨论在 *except-compat*。 - glts


答案:


正如所提到的那样,所有复杂的细节都记录在了 :help except-compat,答案基本归结为向后兼容性和Vimscript固有的灵活性。

从记录的宏到映射到自定义函数有一个自然的进展。考虑到这一点,当函数中的命令导致错误时(例如,一个错误)可能是有意义的 %s/foo/bar/ 这是不匹配和错过的 e 旗帜),处理应继续。

另一方面,当你写“工业级”映射时,你几乎总是使用a try..catch 无论如何阻塞函数调用层次结构(以避免任何多行错误 Error detected while processing function: ...,而是向用户显示一个很好的错误消息)。

所以在实践中,大多数已发布的插件都不使用 abort但是 try..catch无论如何,对于快速的,袖手旁观的东西,你通常不会太在意错误处理。


12
2017-11-17 09:20



有趣。据我所知,函数在错误之后继续,除非在 try..endtry 或者在一个函数中 abort。因此,如果您希望辅助函数将异常传播到执行该操作的函数 catch,所有这些帮手都必须拥有 abort? - So8res
不,一旦进入 try 阻止,行为改变,也适用于嵌套函数。 - Ingo Karkat