深入探索

省略 begin 和 end

在方法,类或模块中捕获异常时,你可以选择省略 beginend。例如,以下所有内容都是合法的:

omit_begin_end.rb
  1. def calc
  2. result = 1/0
  3. rescue Exception => e
  4. puts( e.class )
  5. puts( e )
  6. result = nil
  7. return result
  8. end
  9. class X
  10. @@x = 1/0
  11. rescue Exception => e
  12. puts( e.class )
  13. puts( e )
  14. end
  15. module Y
  16. @@x = 1/0
  17. rescue Exception => e
  18. puts( e.class )
  19. puts( e )
  20. end

在上面显示的所有情况中,如果以通常的方式将 beginend 关键字放在异常处理代码块的开头和结尾,则异常处理也会起作用。

Catch…Throw

在某些语言中,可以使用关键字 catch 捕获异常,使用关键字 throw 来抛出异常。虽然 Ruby 提供了 catchthrow 方法,但它们与异常处理没有直接关系。相反,catchthrow 用于在满足某些条件时跳出已定义的代码块。当然,在发生异常时,你也可以使用 catchthrow 来跳出代码块(尽管这可能不是处理错误的最优雅方式)。

catch_except.rb
  1. catch(:finished) {
  2. print( 'Enter a number: ' )
  3. num = gets().chomp.to_i
  4. begin
  5. result = 100 / num
  6. rescue Exception => e
  7. throw :finished # jump to end of block
  8. end
  9. puts("The result of that calculation is #{result}" )
  10. } # end of :finished catch block

有关 catchthrow 的更多信息,请参见第 6 章。