RT 测试过调用 new 方法传入 exception 对象的方法,但是这样异常信息会丢失。 我以前看 Java 的时候记得有办法的,但是 Ruby 中不知道怎么做, 请教大家 谢谢。
最好给出代码,容易说明白。
set_backtrace + backtrace + caller ? http://apidock.com/ruby/v1_9_3_125/Exception/set_backtrace
有一个很投巧的方法。自定义一个 module,在遇到 exception 的地方,对捕捉到的 exception 进行 extend 然后再抛出。如:
MyError = Module.new begin ... rescue SomeException => e e.extend MyError raise rescue MyError => me # end
这样便可以用 MyError 来再次捕捉但拿到的其他还是原来的 exception。
MyError
这种方法相当于是给 exception 打了个自己的 tag。
#3 楼 确实很巧妙
#3 楼 @ashchan 这样做的话抛出的异常的类型并没有改变啊 毕竟只是个 module 而已。
#1 楼 @chenge 打个比方吧: 现在有个 update 方法,可能抛出不同的异常。但是这些异常都属于 Exception 类型的,仅仅 message 有所不同。我现在封装了这个方法,对于所有抛出的异常,根据 message 分门别类,将其变成不同的异常类型重新抛出,比如 TCP 连接错误就抛出 TcpConnectionException 异常,数据错误就抛出 DataValidationException 异常等等,但是我不希望最原始的异常有信息 (尤其是 backtrace) 丢失,以便于更好的跟踪到原始错误。
@iBachue
难道是 update 方法捕获了不同类型的异常然后变成同一种类型,然后你又要抓它抛出的异常转回不同的类型么...
#7 楼 @luikore 不是啊 只是 update 方法自身总是抛出相同类型的异常而已 只是 message 不同 并不是它捕获了别人不同类型的异常再转换成相同的。这样的话更蛋疼了。