You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
2.3 KiB
48 lines
2.3 KiB
2 years ago
|
# 第二章 VimL 语言基本语法
|
||
|
|
||
|
## 2.5\* 异常处理
|
||
|
|
||
|
异常是编程中相对高级的话题,也是比较有争议的话题。本教程旨在 VimL ,不可能
|
||
|
展开去讨论异常机制。所以如果你不了解异常,也不用异常,那就可完全跳过这节了。
|
||
|
如果你了解异常,并且不反对用异常,那么这里只是告诉你,VimL 也提供了语法支持,
|
||
|
可以让你在脚本中使用异常,其基本语法结构如下:
|
||
|
|
||
|
```vim
|
||
|
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 早
|
||
|
就有备份相关的配置,对编辑保存的文件都可以备份的。
|
||
|
|
||
|
所以,除非要写个比较大与复杂的插件,用异常可能在代码组织上更为简洁,提供更良好
|
||
|
的用户接口。
|