Подтвердить что ты не робот

Использование обработки исключений в качестве общего метода в Ruby

Может ли кто-нибудь сказать мне, есть ли способ сделать обработку исключений как обычный метод и использовать его внутри методов? Позвольте мне объяснить это далее.

Например, у меня есть следующие методы

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 

Как вы можете видеть, хотя мой метод нуждается только в одной строке, из-за кода обработки исключений метод становится больше.

То, что я ищу, - это более тонкое решение, подобное (просто мысль)

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

Обратите внимание, что вышеуказанный код не работает, просто моя идея. Возможно ли это или есть ли другой хороший способ?

4b9b3361

Ответ 1

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

Ответ 2

yep, что-то вроде этого:

 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 

Ответ 3

Конечно, вы можете передать блок в метод, который выводится внутри раздела begin.

Ответ 4

Почему вы спасаете Исключение и поднимаете его послесловие? Ваша процедура вызова снова должна восстановить ваше исключение.

Вы можете сделать:

def divide(num1, num2)
   num1 / num2
end 

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

Вы можете спасти исключение в одной строке:

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

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

Но тогда вы потеряете информацию о том, что произошло Исключение.