本帖最后由 taroxd 于 2014-7-5 13:51 编辑
不对啊我和这例子不一样。
你给的例子是,在class_eval生成动态方法的时候传入了 __FILE__, __LINE__,因此可以追踪报错信息
但是我那个脚本只是单纯的执行啊。为什么传入了__FILE__之后报错的行数就会变掉呢
试验:
# LINE 1 def raise! raise end # eval 'raise!' # D:/Documents/workspace/test.rb:6:in `eval': D:/Documents/workspace/test.rb:3:in `raise!': (RuntimeError) # from (eval):1:in `<main>' # from D:/Documents/workspace/test.rb:6:in `eval' # from D:/Documents/workspace/test.rb:6:in `<main>' # LINE 12 # eval ' # raise', binding # D:/Documents/workspace/test.rb:16:in `<main>': unhandled exception # from D:/Documents/workspace/test.rb:14:in `eval' # from D:/Documents/workspace/test.rb:14:in `<main>' # LINE 19 # eval 'raise', binding, __FILE__, # __LINE__ # D:/Documents/workspace/test.rb:21:in `<main>': unhandled exception # from D:/Documents/workspace/test.rb:20:in `eval' # from D:/Documents/workspace/test.rb:20:in `<main>' # LINE 26 # instance_eval 'raise!' # D:/Documents/workspace/test.rb:27:in `instance_eval': D:/Documents/workspace/test.rb:3:in `raise!': (RuntimeError) # from (eval):1:in `<main>' # from D:/Documents/workspace/test.rb:27:in `instance_eval' # from D:/Documents/workspace/test.rb:27:in `<main>' # LINE 33 # instance_eval 'raise!', __FILE__, # __LINE__ # D:/Documents/workspace/test.rb:3:in `raise!': unhandled exception # from D:/Documents/workspace/test.rb:35:in `<main>' # from D:/Documents/workspace/test.rb:34:in `instance_eval' # from D:/Documents/workspace/test.rb:34:in `<main>'
# LINE 1
def raise!
raise
end
# eval 'raise!'
# D:/Documents/workspace/test.rb:6:in `eval': D:/Documents/workspace/test.rb:3:in `raise!': (RuntimeError)
# from (eval):1:in `<main>'
# from D:/Documents/workspace/test.rb:6:in `eval'
# from D:/Documents/workspace/test.rb:6:in `<main>'
# LINE 12
# eval '
# raise', binding
# D:/Documents/workspace/test.rb:16:in `<main>': unhandled exception
# from D:/Documents/workspace/test.rb:14:in `eval'
# from D:/Documents/workspace/test.rb:14:in `<main>'
# LINE 19
# eval 'raise', binding, __FILE__,
# __LINE__
# D:/Documents/workspace/test.rb:21:in `<main>': unhandled exception
# from D:/Documents/workspace/test.rb:20:in `eval'
# from D:/Documents/workspace/test.rb:20:in `<main>'
# LINE 26
# instance_eval 'raise!'
# D:/Documents/workspace/test.rb:27:in `instance_eval': D:/Documents/workspace/test.rb:3:in `raise!': (RuntimeError)
# from (eval):1:in `<main>'
# from D:/Documents/workspace/test.rb:27:in `instance_eval'
# from D:/Documents/workspace/test.rb:27:in `<main>'
# LINE 33
# instance_eval 'raise!', __FILE__,
# __LINE__
# D:/Documents/workspace/test.rb:3:in `raise!': unhandled exception
# from D:/Documents/workspace/test.rb:35:in `<main>'
# from D:/Documents/workspace/test.rb:34:in `instance_eval'
# from D:/Documents/workspace/test.rb:34:in `<main>'
总之加个 binding或者__FILE__, Ruby就会变得聪明?
我觉得就像37行报错一样,加了个__LINE__查找堆栈时,eval这个错误的记录就会记在35行。
但是caller_stack的最外层是如何受到 __FILE__,__LINE__的影响的呢?不传入__FILE__,就会报在eval上面;传入了,就会报在raise!上面
@无脑之人 你的解答告诉了我第37行的原理,但我想要的是第36行的报错原理
话说我没有在元编程啦233
还有,为什么RM的代码高亮不支持HERE DOCUMENT啊啊啊,害得我一直用%{} |