Metaprogrammazione wrap exception


#1

Ciao a tutti, sto cercando di crearmi attraverso prepend e un po di
metaprogrammazione un modo per catturare le eccezioni per dei metodi di
classe passati come parametri.

Il modulo che mi sono creato è il seguente:

module HandleException

def self.included(base)
base.send(:extend, ClassMethods)
end

module ClassMethods
def wrap_exceptions_for(*methods)
silencer = Module.new do
methods.each do |method|
define_method method do |*args|
begin
super(*args)
rescue => e
file = e.backtrace[0].split(":")[-3].split("/").last
ln = e.backtrace[0].split(":")[-2]
message = file+":"+ln + " => " + e.message
p message
end
p “continua dentro il modulo”
end
end
end
singleton_class.prepend silencer
end
end
end

Ho creato una classe per usare il mio modulo
class RemitController
include HandleException

wrap_exceptions_for :download, :converti

class << self

def download(controparte: , **_keyword_args)
  p "download"
  p "continua"
end

def converti(controparte: , **_keyword_args)
  p "converti"
  rescue "Errore"
  p "continua"
end

end
end

Il problema è che funziona tutto corretamente l’eccezione viene gestita
dal mio modulo, il problema è che il codice dopo la gestione della mia
eccezione non viene eseguito. Quindi per esempio nel metodo converti
p “continua”, non viene eseguito, ma viene eseguito
p “continua dentro il modulo”, come posso fare in modo che l’esecuzione
del programma continui eseguendo il codice dopo la mia rescue.

Grazie