Ruby Ruby 中如何修改被抛出的 Exception 的类型,同时不丢失任何异常信息?

ibachue · 2012年12月01日 · 最后由 iBachue 回复于 2012年12月02日 · 3343 次阅读

RT 测试过调用 new 方法传入 exception 对象的方法,但是这样异常信息会丢失。 我以前看 Java 的时候记得有办法的,但是 Ruby 中不知道怎么做, 请教大家 谢谢。

最好给出代码,容易说明白。

有一个很投巧的方法。自定义一个 module,在遇到 exception 的地方,对捕捉到的 exception 进行 extend 然后再抛出。如:

MyError = Module.new

begin
  ...
  rescue SomeException => e
  e.extend MyError
  raise
rescue MyError => me
  #
end

这样便可以用 MyError 来再次捕捉但拿到的其他还是原来的 exception。

这种方法相当于是给 exception 打了个自己的 tag。

#3 楼 确实很巧妙

#3 楼 @ashchan 这样做的话抛出的异常的类型并没有改变啊 毕竟只是个 module 而已。

#1 楼 @chenge 打个比方吧: 现在有个 update 方法,可能抛出不同的异常。但是这些异常都属于 Exception 类型的,仅仅 message 有所不同。我现在封装了这个方法,对于所有抛出的异常,根据 message 分门别类,将其变成不同的异常类型重新抛出,比如 TCP 连接错误就抛出 TcpConnectionException 异常,数据错误就抛出 DataValidationException 异常等等,但是我不希望最原始的异常有信息 (尤其是 backtrace) 丢失,以便于更好的跟踪到原始错误。

@iBachue

难道是 update 方法捕获了不同类型的异常然后变成同一种类型,然后你又要抓它抛出的异常转回不同的类型么...

#7 楼 @luikore 不是啊 只是 update 方法自身总是抛出相同类型的异常而已 只是 message 不同 并不是它捕获了别人不同类型的异常再转换成相同的。这样的话更蛋疼了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号