rails - Ruby Rescue para mostrar Backtrace completo
rescue in ruby (2)
El valor se almacena allí en algún lugar, según esta llamada a #inspect:
irb(main):001:0> begin
irb(main):002:1* puts File.join(nil, "Hello")
irb(main):003:1> rescue => exception
irb(main):004:1> puts exception.inspect
irb(main):005:1> end
#<TypeError: can''t convert nil into String>
=> nil
Exception#message es la parte descriptiva:
irb(main):006:0> begin
irb(main):007:1* puts File.join(nil, "hello")
irb(main):008:1> rescue => ex
irb(main):009:1> puts ex.message
irb(main):010:1> end
can''t convert nil into String
=> nil
Entonces, para obtener el tipo de datos que está buscando, podría hacer algo como lo siguiente:
irb(main):015:0> begin
irb(main):016:1* puts File.join(nil, "hey")
irb(main):017:1> rescue => ex
irb(main):018:1> puts "#{ex.backtrace}: #{ex.message} (#{ex.class})"
irb(main):019:1> end
(irb):16:in `join''(irb):16:in `irb_binding''C:/Ruby/lib/ruby/1.8/irb/workspace.rb
:52:in `irb_binding'':0: can''t convert nil into String (TypeError)
=> nil
Aquí hay un ejemplo rápido real:
puts File.join(nil, "hello")
Saldría
test.rb:4:in ''join'': can''t convert nil into String (TypeError)
from test.rb:4
Pero cuando hago esto:
begin
puts File.join(nil, "hello")
rescue => exception
puts exception.backtrace
end
Esto dará salida
test.rb:4:in ''join''
test.rb:4
Ahora, ¿cómo capturo el retroceso completo, incluida la parte "no se puede convertir nil en String (TypeError)"?
@Sarah Vessels: en mi código específico, este fragmento de código:
puts "=============================="
puts error.message
puts "=============================="
puts error.inspect
puts "=============================="
puts error.backtrace
puts "=============================="
devoluciones
==============================
exit
==============================
#<SystemExit: exit>
==============================
/usr/lib/ruby/1.8/glib2.rb:37:in `exit''
/usr/lib/ruby/1.8/glib2.rb:37:in `exit_application''
multi.rb:234:in `main''
multi.rb:347
==============================
La respuesta de @SaraVessels está más cerca de lo que desea, pero pensé que una alternativa lista para usar también podría ayudar a otros.
Para los guionistas de nosotros, ruby viene con dos globales útiles (bueno, creo que de hilo global ), $!
y $@
que apuntan a la última excepción y al último rastreo de excepciones.
begin
puts File.join(nil, "Hello")
rescue
puts $! # ("no implicit ....")
puts $@ # backtrace
end
saldrá:
no implicit conversion of nil into String
/tmp/e.rb:2:in `join''
/tmp/e.rb:2:in `<main>''
Esto no es muy explícito, pero es útil en entornos interactivos o muy prototípicos.
Ruby stdlib incluye el módulo ''English'' (sí, en mayúsculas), con el que puedes hacer
require "English" # capital-E!
# ...
puts $ERROR_INFO # $! ("no implicit ....")
puts $ERROR_POSITION # $@ backtrace
# ...
Es raro y nunca lo usé, pero tal vez alguien esté más contento con eso.