예외가 발생하면 종종 호출 스택 내부에서 발생합니다. 이런 일이 발생하는 경우, 종종 실제 코드 위반이 숨겨집니다.
tmp.rb:7:in `t': undefined method `bar' for nil:NilClass (NoMethodError)
from tmp.rb:10:in `s'
from tmp.rb:13:in `r'
from tmp.rb:16:in `q'
from tmp.rb:19:in `p'
from tmp.rb:22:in `o'
from tmp.rb:25:in `n'
from tmp.rb:28:in `m'
from tmp.rb:31:in `l'
... 8 levels...
from tmp.rb:58:in `c'
from tmp.rb:61:in `b'
from tmp.rb:64:in `a'
from tmp.rb:67
“… 8 레벨 …”잘림으로 인해 많은 문제가 발생했습니다. 나는 이것에 대한 인터넷 검색에별로 성공하지 못했습니다. 루비에게 덤프에 전체 스택을 포함시키고 싶다고 어떻게 말합니까?
답변
예외 # backtrace에는 전체 스택이 있습니다.
def do_division_by_zero; 5 / 0; end
begin
do_division_by_zero
rescue => exception
puts exception.backtrace
raise # always reraise
end
(Peter Cooper의 Ruby Inside 블로그 에서 영감을 받음 )
답변
간단한 원 라이너를 원한다면이 작업을 수행 할 수도 있습니다.
puts caller
답변
이렇게하면 오류 설명과 깔끔하고 들여 쓰기 된 스택 추적이 생성됩니다.
begin
# Some exception throwing code
rescue => e
puts "Error during processing: #{$!}"
puts "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
end
답변
IRB에는이 끔찍한 “기능”에 대한 설정이 있으며이를 사용자 지정할 수 있습니다.
~/.irbrc
다음 행을 포함 하는 파일을 작성하십시오 .
IRB.conf[:BACK_TRACE_LIMIT] = 100
이를 통해 irb
적어도 100 개의 스택 프레임을 볼 수 있습니다 . 비 대화식 런타임에 해당하는 설정을 찾을 수 없습니다.
IRB 사용자 정의에 대한 자세한 정보는 Pickaxe 서적 에서 찾을 수 있습니다 .
답변
콜 스택을위한 하나의 라이너 :
begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace; end
모든 보석이없는 콜스 택용 라이너 :
begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace.grep_v(/\/gems\//); end
모든 gem이없고 현재 디렉토리에 상대적인 콜 스택을위한 하나의 라이너
begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace.grep_v(/\/gems\//).map { |l| l.gsub(`pwd`.strip + '/', '') }; end
답변
중요한 루비 추적을 모방합니다.
begin
0/0 # or some other nonsense
rescue => e
puts e.backtrace.join("\n\t")
.sub("\n\t", ": #{e}#{e.class ? " (#{e.class})" : ''}\n\t")
end
흥미롭게도 ‘처리되지 않은 예외’를 올바르게 처리하지 않아 ‘RuntimeError’로보고되지만 위치는 정확합니다.
답변
테스트 환경을로드하려고 할 때 (레이크 테스트 또는 자동 테스트를 통해) 이러한 오류가 발생하여 IRB 제안이 도움이되지 않았습니다. 나는 전체 test / test_helper.rb를 begin / rescue 블록에 포장하고 결과를 수정했습니다.
begin
class ActiveSupport::TestCase
#awesome stuff
end
rescue => e
puts e.backtrace
end