【问题标题】:Having Exception handling as a common method in Ruby将异常处理作为 Ruby 中的常用方法
【发布时间】:2011-11-18 00:54:00
【问题描述】:

谁能告诉我有没有办法将异常处理作为一种常用方法并在方法中使用它?让我进一步解释一下。

例如,我有以下方法

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

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

【问题讨论】:

  • 请注意,您还可以通过消除begin..end 来减少冗长,因为您可以在def..end 中添加rescue 以达到相同的效果。

标签: ruby exception-handling


【解决方案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】:

是的,类似的东西:

 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】:

当然,您可以将块传递给在开始部分内产生的方法。

【讨论】:

  • 感谢您的快速回复,您能否指导我查看块和产量代码示例的示例用法,再次感谢
  • 你用谷歌搜索和让我搜索一样快:)
  • @MWiesner 实际上是这样;这是前两个答案的删减版本。
【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多