问题 将异常处理作为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

请注意上面的代码不起作用,只是我的想法。这可能还是有其他好方法吗?


4517
2017-09-15 16:07


起源

请注意,您还可以通过消除。来减少详细程度 begin..end,你可以有一个 rescue 在一个 def..end 具有相同的效果。 - hammar


答案:


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

12
2017-09-15 16:14



要考虑的一个潜在缺点是,所有引发的错误都会指向相同的行号 - rm-rf
没错,但这也是一个人为的例子。如果您只是重新提出错误,那么您首先不会理会它。如果您有一些常见的错误处理代码,这将非常有用。 - David
@David,非常感谢,这是我想要的......:D - sameera207


是的,类似的东西:

 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 

4
2017-09-15 16:17



谢谢你的回答,我不得不接受大卫的回答,因为他已经给出了答案,对不起......但再次感谢,这是我想要的...... - sameera207


当然,你可以将一个块传递给一个在begin部分内部产生的方法。


0
2017-09-15 16:09



感谢快速回复,您可以指导我使用块和yield代码示例的示例,再次感谢 - sameera207
谷歌就像让我这样快:) - Dave Newton
解决了我的问题,谢谢你的帮助:D - sameera207
@MWiesner实际上确实如此;它是前两个答案的一个被删除的版本。 - Dave Newton


你为什么要救出一个例外并在之后提出它? 您的调用例程必须再次解除您的异常。

你可以这样做:

def divide(num1, num2)
   num1 / num2
end 

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

您可以在一行中解救Exception:

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

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

但是你会丢失Exception发生的信息。


0
2017-09-15 18:57