Наличие обработки исключений в качестве распространенного метода в Ruby - PullRequest
12 голосов
/ 15 сентября 2011

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 15 сентября 2011
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
4 голосов
/ 15 сентября 2011

Да, что-то в этом роде:

 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 голосов
/ 15 сентября 2011

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

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

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

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

0 голосов
/ 15 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...