除了Ruby中的一个错误外,处理所有类型的错误?

除了Ruby中的一个错误外,处理所有类型的错误?,ruby,exception,Ruby,Exception,我有一个方法,它可以抛出带有一些有意义的描述的parserception,并对任何StandardError抛出generalparserception: 作为一个最小的可复制示例: begin item = parseItem(json) if !item.id raise ParserException.new("id property is missing") end item rescue => ex raise ParserException.ne

我有一个方法,它可以抛出带有一些有意义的描述的
parserception
,并对任何
StandardError
抛出general
parserception

作为一个最小的可复制示例:

begin
  item = parseItem(json)

  if !item.id
    raise ParserException.new("id property is missing")
  end

  item
rescue => ex
  raise ParserException.new("exception occurred when tried to parse JSON", ex: ex)
end
现在的问题是,如果缺少
id
属性,则会捕获
ParserException
,并将其包装到另一个
ParserException
中,然后使用意义较小的消息重新抛出

我可以这样做来修复它:

begin 
  # ...
rescue ParserException
  raise
rescue => ex
  raise ParserException.new("exception occurred when tried to parse JSON", ex: ex)
end
但它可能看起来有点难看。有没有更简洁的方法来实现这一点?类似于
救援!ParserException=>ex

例如,在C#中,我可以做到(这也可能被认为是丑陋的,但我问是出于好奇):


您当前的修复可能是最干净的方式,但是我认为您不希望出现额外的援救障碍,您也可以在您的全面解决方案中处理它

begin 
  # ...
rescue => ex
  raise if ex.is_a? ParserException
  raise ParserException.new("exception occurred when tried to parse JSON", ex: ex)
end

您提出的工作解决方案(特别是
rescue
,然后是sink all
rescue
)是惯用的正确方法。它并不难看。如果
ParserException
是您的类,您可以重新实现它的
initialize
函数,如果
ex
已经是
ParserException
就可以克隆它。那么单
rescue
就行了。@AlekseiMatiushkin谢谢你的回答:)是的,我主要担心Ruby的习惯用法,因为我只是在学习这门语言。第二个主意听起来也不错,我会试试这个。当你说异常被“捕获、包装,然后用一条意义不大的消息重新抛出”时,其他类型的异常不会也发生这种情况吗?或者这就是你真正想要的吗?@arcadeblast77哦,是的,这就是我希望在任何其他类型的意外异常中发生的:)但我想让我的
ParserException
s与原始消息一起传递
begin 
  # ...
rescue => ex
  raise if ex.is_a? ParserException
  raise ParserException.new("exception occurred when tried to parse JSON", ex: ex)
end