2011-09-15 3 views
11

¿Puede alguien decirme que hay una manera de hacer que el manejo de excepciones sea un método común y usarlo dentro de un método? Déjame explicarlo más.Tener el manejo de excepciones como un método común en Ruby

Por ejemplo, he métodos siguientes

def add(num1, num2) 
begin 
    num1 + num2 
rescue Exception => e 
    raise e 
end 
end 

def divide(num1, num2) 
begin 
    num1/num2 
rescue Exception => e 
    raise e 
end 
end 

Como se puede ver, aunque mi método necesita sólo una línea, debido al código de control de excepciones, el método se hace más grande.

Lo que estoy buscando es una solución más delgado como (sólo un pensamiento)

def add(num1, num2) 
    num1 + num2 unless raise_exception 
end 

def divide(num1, num2) 
num1/num2 unless raise_exception 
end 

def raise_exception 
    raise self.Exception 
end 

Tenga en cuenta que el código anterior no funciona, sólo mi idea. ¿Es esto posible o hay alguna otra buena manera?

+0

Tenga en cuenta que también puede reducir la verbosidad eliminando el 'begin..end', ya que puede tener un' rescue' dentro de un 'def..end' con el mismo efecto. – hammar

Respuesta

11
def handle_exception(&block) 
    yield 
rescue Exception => e 
    raise e 
end 

def add(num1, num2) 
    handle_exception { num1 + num2 } 
end 

def divide(num1, num2) 
    handle_exception { num1/num2 } 
end 
+0

Una posible desventaja a tener en cuenta es que todos los errores planteados apuntarían al mismo número de línea –

+0

Cierto, pero este también es un ejemplo inventado. Si solo estuvieras repitiendo el error, no te molestarías en detectarlo en primer lugar. Esto sería útil si tiene algún código común de manejo de errores. – David

+0

@David, muchas gracias, este es el que yo quería ...: D – sameera207

0

Claro, se puede pasar un bloque a un método que ceda en la sección de inicio.

+0

gracias por la respuesta rápida, ¿podría dirigirme a un ejemplo de uso de bloque y muestra de código de rendimiento, gracias de nuevo – sameera207

+0

Sería tan rápido para que google como que yo lo hago :) –

+0

tengo mi problema solucionado, gracias para la ayuda: D – sameera207

4

sí, algo así:

def try 
    yield 
    rescue Exception => e 
    puts 'I`m rescued' 
    end 

    def devide(num1, num2) 
    try { num1/num2 } 
    end 

ruby-1.9.2-p180 :013 > devide(5,1) 
=> 5 
ruby-1.9.2-p180 :014 > devide(5,0) 
I`m rescued 
=> nil 
+0

gracias por la respuesta, tuve que aceptar la respuesta de David ya que me dio la respuesta primero, lo siento ... pero gracias de nuevo, esta es la única Quise... – sameera207

0

¿Por qué rescatar a una excepción y lo levanta epílogos? Su rutina de llamada debe rescatar nuevamente su excepción.

que podría hacer:

def divide(num1, num2) 
    num1/num2 
end 

begin 
    divide(1,0) 
rescue Exception => e 
    puts "Exception '#{e}' occured" 
end 

Usted puede rescatar la excepción en una línea:

def divide2(num1, num2) 
    num1/num2 rescue Exception 
end 

p divide2(6,3) # -> 2 
p divide2(1,0) # -> Exception 

Pero entonces usted va a perder la información de la que se produjo la excepción.