2.5* 异常处理

优质
小牛编辑
123浏览
2023-12-01

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 早 就有备份相关的配置,对编辑保存的文件都可以备份的。

所以,除非要写个比较大与复杂的插件,用异常可能在代码组织上更为简洁,提供更良好 的用户接口。