207 votes

Comment faire en sorte que ruby imprime une trace complète au lieu d'une trace tronquée?

Lorsque j'obtiens des exceptions, cela vient souvent du plus profond de la pile d'appels. Lorsque cela se produit, le plus souvent, la ligne de code incriminée m'est cachée:

 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
 

Cette troncature "... 8 niveaux ..." me cause beaucoup de problèmes. Je n'ai pas beaucoup de succès dans la recherche de celui-ci sur Google: comment dire à Ruby que je veux que les sauvegardes incluent la pile complète?

286voto

Gareth Points 42402

Exception # backtrace contient toute la pile:

 def do_division_by_zero; 5 / 0; end
begin
  do_division_by_zero
rescue => exception
  puts exception.backtrace
  raise exception # always reraise
end
 

(Extrait du blog Ruby Inside de Peter Cooper)

203voto

Charlie Somerville Points 5856

Vous pouvez également le faire si vous souhaitez une ligne simple:

 puts caller
 

109voto

Ben Points 331

Ceci produit la description de l’erreur et une belle pile de pile propre et indentée:

 begin               
 # Some exception throwing code
rescue => e
  puts "Error during processing: #{$!}"
  puts "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
end
 

52voto

robinluckey Points 171

L'IRB dispose d'un paramètre pour cette "fonctionnalité" affreuse, que vous pouvez personnaliser.

Créez un fichier appelé ~/.irbrc comprenant la ligne suivante:

 IRB.conf[:BACK_TRACE_LIMIT] = 100
 

Cela vous permettra de voir au moins 100 images de pile dans irb . Je n'ai pas été en mesure de trouver un paramètre équivalent pour le runtime non interactif.

Des informations détaillées sur la personnalisation de la CISR sont disponibles dans le livre Pickaxe .

4voto

Ryan Angilly Points 446

J'avais ces erreurs en essayant de charger mon environnement de test (via un test de rake ou un autotest) et les suggestions de la CISR n'ont pas aidé. J'ai fini par envelopper tout mon test / test_helper.rb dans un bloc begin / rescue et cela a résolu le problème.

 begin
  class ActiveSupport::TestCase
    #awesome stuff
  end
rescue => e
  puts e.backtrace
end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X