短: 有没有办法在Ruby中干掉 – 如果这样: def entry_point_one begin do_something rescue MySyntaxErrorOne, MySyntaxErrorTwo, MySyntaxErrorEtc = syn_err raise syn_err.exception(syn_err.message) endenddef entry_point_two begin
有没有办法在Ruby中干掉 – 如果这样:
def entry_point_one begin do_something rescue MySyntaxErrorOne, MySyntaxErrorTwo, MySyntaxErrorEtc => syn_err raise syn_err.exception(syn_err.message) end end def entry_point_two begin do_something_else rescue MySyntaxErrorOne, MySyntaxErrorTwo, MySyntaxErrorEtc => syn_err raise syn_err.exception(syn_err.message) end end
更长:
我正在建一个翻译.可以使用不同的入口点调用此解释器.如果我为这个解释器提供一个’脏’字符串,我希望它会引发错误.但是,如果我没有被do_something直接或间接调用的每个方法的整个后向跟踪发送垃圾邮件,那将是很好的,特别是因为解释器使用递归.
正如您在上面的代码片段中所看到的,我已经知道了一种重新引发错误并从而删除回溯的方法.我想要做的是删除上面示例中的重复.我到目前为止最接近的是:
def entry_point_one re_raise_known_exceptions {do_something} end def entry_point_two re_raise_known_exceptions {do_something_else} end def re_raise_known_exceptions yield rescue MySyntaxErrorOne, MySyntaxErrorTwo, MySyntaxErrorEtc => syn_err raise syn_err.exception(syn_err.message) end
但这使得该方法重新提升 – 已知 – 异常出现在后面的跟踪中.
编辑:我想我想要的就是C预处理宏
您可以在阵列上使用splat.直接来自IRB:
COMMON_ERRORS = [ArgumentError, RuntimeError] # add your own def f yield rescue *COMMON_ERRORS => err puts "Got an error of type #{err.class}" end f{ raise ArgumentError.new } Got an error of type ArgumentError f{ raise 'abc' } Got an error of type RuntimeError