加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – DRY在多个地方重新提出相同的例外情况的方式

发布时间:2020-12-17 01:24:06 所属栏目:百科 来源:网络整理
导读:短: 有没有办法在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 do_something_else
短:

有没有办法在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,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读