result = ""
begin
...
rescue Exception1 => e
result = "Error1"
rescue Exception2 => e
result = "Error2"
ensure
...
result
end
end
def method1
...
result = method2!(params)
respond_to do |format|
if result.empty?
format.html { redirect_to root_url }
else
format.html {
logger.error result
render :action => :new
}
end
end
end
El tema está en que cuando comprobaba el valor de vuelta en
“result.empty?” me cascaba advirtiendome que el metodo no existe en
TrueClass.
Mucho me temo que lo que pasaba es que no entendÃa como funcionaba la
captura de las excepciones. Mi idea era que el valor de retorno de la
funcion era el de la ejecucion de la ultima sentencia dentro del ensure.
He corregido el codigo y ahora ya funciona como esperaba. Los
“Poltergeist” y cosas raras mejor para el cine…
On Wed, Jun 17, 2009 at 1:06 PM, Raul
Martinez[email protected] wrote:
  ensure
   …
   result
  end
end
Eso esta bastante raro.
El valor de un begin/rescue si no salta ninguna excepcion es el de la
ultima expresion en el begin, o la ultima de la clausula else si esta
existe. Si salta una excepcion y se captura en una clausula rescue, el
valor del begin/rescue es de la ultima expresion de dicha clausula.
Si salta una excepcion y no se captura no hay valor de retorno ya que
la expresion se tira para arriba al caller.
Como ves, la clausula ensure no pinta nada en cuanto al valor de
retorno (si bien tecnicamente se puede usar return ahi).
Podria ser que lo que quieras sea una clausula else en lugar de una
ensure?
Naturalmente siempre puedes devolver result poniendolo al final del
metodo, fuera del begin/rescue, pero antes miraria si el ensure esta
bien usado.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.