除了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
抛出generalparserception
:
作为一个最小的可复制示例:
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 allrescue
)是惯用的正确方法。它并不难看。如果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