Ruby错误回溯栈中数字含义?是否代表EOFError与NoMethodError在不同线程抛出?
结论
不是,这两个错误没有发生在不同线程,属于同一个线程内的异常链式抛出。
原因说明
- Ruby回溯栈的序号是对单个异常的调用栈层级做计数:
most recent call last说明序号越大,对应调用层级越靠外、执行时机越早,序号1就是直接触发报错的上一行调用。 - 你给出的回溯栈是典型的「异常处理过程中又抛出新异常」的场景:
- 首先抛出
EOFError:调用栈对应conn.rb第72行的初始化逻辑,调用readpartial方法时触发sysread报错 - 程序进入
EOFError的rescue捕获逻辑:第二个NoMethodError的调用栈第4层明确标注了rescue in block in initialize,就是在处理前一个EOFError的过程中,执行断连、重传逻辑的时候,调用transmit方法发现目标对象为nil,才抛出了第二个NoMethodError
- 首先抛出
- 序号重新从1开始计数,是Ruby打印多个关联异常时的默认行为,每个异常独立统计自己的调用栈层级,和线程无关。
内容的提问来源于stack exchange,提问作者Juanito Fatas
相关产品推荐
相关产品推荐

