try rails how exceptions error custom catch begin ruby exception

rails - ruby exception backtrace



Captura de números de línea en ruby excepciones (5)

Considere el siguiente código ruby

test.rb:

begin puts thisFunctionDoesNotExist x = 1+1 rescue Exception => e p e end

Para fines de depuración, me gustaría que el bloque de rescate sepa que el error ocurrió en la línea 4 de este archivo. ¿Hay una manera limpia de hacer eso?


Es posible que en Ruby 1.9.3 pueda acceder no solo a esta información de una manera más estructurada, confiable y simple sin usar expresiones regulares para cortar cadenas.

La idea básica es introducir un objeto de marco de llamada que da acceso a información sobre la pila de llamadas.

Ver http://wiki.github.com/rocky/rb-threadframe/ , que por desgracia, requiere parchear Ruby 1.9. En RubyKaigi 2010 (finales de agosto de 2010) está programada una reunión para discutir la introducción de un objeto marco en Ruby.

Dado esto, lo más temprano que esto podría suceder es en Ruby 1.9.3.


Lanzando mi $ 0.02 en este viejo hilo-- aquí hay una solución simple que mantiene todos los datos originales:

print e.backtrace.join("/n")


Por lo general, el backtrace contiene muchas líneas de gemas externas. Es mucho más conveniente ver solo líneas relacionadas con el proyecto en sí.

Mi sugerencia es filtrar la traza inversa por el nombre de la carpeta del proyecto

puts e.backtrace.select { |x| x.match(/HERE-IS-YOUR-PROJECT-FOLDER-NAME/) }

Y luego puede analizar líneas filtradas para extraer los números de línea como se sugiere en otras respuestas.


Puede acceder a la traza inversa desde un objeto de excepción. Para ver toda la traza inversa:

p e.backtrace

Contendrá una matriz de archivos y números de línea para la pila de llamadas. Para un script simple como el de su pregunta, solo contendría una línea.

["/Users/dan/Desktop/x.rb:4"]

Si desea el número de línea, puede examinar la primera línea de la traza inversa y extraer el valor después de los dos puntos.

p e.backtrace[0].split(":").last


p e.backtrace

Lo ejecuté en una sesión de IRB que no tiene fuente y todavía me dio información relevante.

=> ["(irb):11:in `foo''", "(irb):17:in `irb_binding''", "/usr/lib64/ruby/1.8/irb/workspace.rb:52:in `irb_binding''", "/usr/lib64/ruby/1.8/irb/workspace.rb:52"]

Si desea una traza inversa muy bien analizada, la siguiente expresión regular podría ser útil:

p x.backtrace.map{ |x| x.match(/^(.+?):(/d+)(|:in `(.+)'')$/); [$1,$2,$4] } [ ["(irb)", "11", "foo"], ["(irb)", "48", "irb_binding"], ["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", "irb_binding"], ["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", nil] ]

(Regex / should / be safe contra caracteres extraños en nombres de funciones o directorios / nombres de archivos) (Si te estás preguntando de dónde salió Foo, hice una def para obtener la excepción:

>>def foo >> thisFunctionDoesNotExist >> rescue Exception => e >> return e >>end >>x = foo >>x.backtrace