with rails lanzar error custom ruby

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.