我发现自己输入了类似
的内容class Foo{
myFancyType bar();
}
myFancyType Foo::bar()
{
try{
//do some stuff
}
catch(myFavoriteExceptionType &e){
std::cerr<<e.what()<<std::endl;
throw myFavoriteExceptionType("Foo::bar() failed");
}
}
非常,非常,非常,经常。
我目前正在使用vim,但我的搜索失败了。是否有一些插件可以自动化在定义函数时手动插入try / catch语句的令人讨厌的重复性任务?
答案 0 :(得分:1)
tab
键触发,但可以设置为任何其他领导键击。它的工作方式非常简单:假设您已经为try catch定义了一个片段,那么您只需在插入模式try<tab>
中编写它,然后插入try catch构造。连续的标签会让你跳转到需要输入的代码片段的不同部分(比如你捕获的内容,你想如何处理它,最后是尝试过的代码)。
另一个选择是尝试尝试比snipmate更聪明的UltiSnips,因为你可以在解析片段时运行一些代码。
你也可以在没有任何插件的情况下制作片段。您可以使用map
执行正常模式,或abbrev
执行插入模式:
map <leader>st maotry {<CR>} catch (my_exception err) {<CR>std::cerr<<e.what()<<std::endl;<CR>throw myFavoriteExceptionType("Foo::bar() failed");<CR>}<ESC>='a'ao
将设置标记(ma
),在下一行(o
)开始编辑,将模板代码写入<ESC>
。然后它将从标记(='a
)开始对齐代码,最后跳转到标记以开始编辑try {}
块。
或者您也可以使用缩写:
iabbrev try <C-o>matry {<CR>} catch (my_exception err) {<CR>std::cerr<<e.what()<<std::endl;<CR>throw myFavoriteExceptionType("Foo::bar() failed");<CR>}<ESC>='a'ao
虽然你在插入模式下输入,但它会做同样的事情。
HTH
答案 1 :(得分:0)
在lh-cpp中,我在try
和catch
上提供(上下文相关的)(插入模式)缩写,映射可以使用try{...}catch{}
或catch(){...}
,以及可以同时执行这两项操作的摘要。
还提供了其他C和C ++控制语句的片段,缩写和映射。
PS:在每一步中捕获异常通常是非常糟糕的C ++模式(在其他语言中有例外)。请参阅E.17 and E.18 in CppCoreGuidelines. - E.17:不要尝试捕获每个函数中的每个异常; E.18:尽量减少使用显式的try / catch