我有一个方法可以抛出带有一些有意义的描述的ParserException,并在任何ParserException上抛出generalStandardError
作为一个最小的可重复的例子:

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

但是看起来有点难看有没有更简洁的方法来实现这一点像rescue !ParserException => ex
例如,在C中,我可以这样做(这也可能被认为是丑陋的,但我问是因为好奇):
try
{
    throw new ParserException("Specific error");
catch (Exception ex) when (!(ex is ParserException))
{
    throw new ParserException("Generic error");
}

最佳答案

你当前的修复可能是最干净的方法,但我你不希望额外的救援块,你也可以处理它在你的全面解决方案。

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

09-10 20:43