第二章 VimL 语言基本语法
2.5* 异常处理
异常是编程中相对高级的话题,也是比较有争议的话题。本教程旨在 VimL ,不可能 展开去讨论异常机制。所以如果你不了解异常,也不用异常,那就可完全跳过这节了。 如果你了解异常,并且不反对用异常,那么这里只是告诉你,VimL 也提供了语法支持, 可以让你在脚本中使用异常,其基本语法结构如下:
try
尝试语句块
catch /正则1/
异常处理1
catch /正则2/
异常处理2
...
finally
收尾语句块
endtry
大致流程是这样的:先执行 try
下面的尝试语句块,如果这过程中不出现错误, 那就没 catch
什么事了,但是如果有 finally
,其后的收尾语句块也会执行。麻烦 在于如果尝试语句块中有错误发生,就会抛出一个错误。错误用字符串消息的形式,所以 catch
用正则表达式捕获。由于错误消息可能有本地化翻译,所以匹配错误号比较通用 。如果 catch
没有参数,则捕获所有错误。一旦错误被某个 catch
正确匹配了,就 执行其后的异常处理语句块,然后如果有 finally
的话,收尾语句块也会执行。
如果在 try
中出现了错误,既没有 catch
捕获,也没有 finally
善后,那它就 向上层继续抛出这个错误。直到有地方处理了这个错误,如果一直没能处理该错误,就终 止脚本运行。
除了 vim 执行脚本中自动检测错误抛出外,也有个命令 :throw
可手动抛出。比较常 见的在 catch
的异常处理块中,只处理了部分工作后,用 :throw
重新抛出错误让 后续机制继续处理。:throw
不带参数时重新抛出最近相同的错误,否则可带上参数抛 出指定错误。
虽然 VimL 也提供了这个一套完整的异常处理机制,但一般情况下用得不多。大约有以下 原因:
- 使用 VimL 希望简单,用上异常就似乎很复杂了。
- vim 脚本本身就很安全,只能在 vim 环境下运行,似乎干不了什么坏事。而且 vim 早 就有备份相关的配置,对编辑保存的文件都可以备份的。
所以,除非要写个比较大与复杂的插件,用异常可能在代码组织上更为简洁,提供更良好 的用户接口。