假设我有以下几点:

begin
  raise 'Exception!'
rescue => e
  puts "Rescued exception: #{e.message}"
  raise 'Something I did in this block raised an exception!'
end

抓住第二个例外的最鲁莽的方法是什么?是最好把整个东西都包在另一个begin rescue块中,还是有更优雅的解决方案?

最佳答案

我不能用拓荒者的方式说话,但这里有一个拓荒者的方式:
使救援代码尽可能地防错。如果无法证明异常非常罕见,那么与其在救援块中开始一个救援块嵌套,不如调用另一个处理自身异常的方法,例如:

def foo
  1/0
rescue
  complicated_foo_error_handler
end

private

def complicated_foo_error_handler
  # handle foo errors
rescue
  complicated_complicated_foo_error_handler_error_handler
end

def complicated_complicated_foo_error_handler_error_handler
  # handle complicated_foo_error_handler errors
rescue
  STDERR.puts 'I give up!'
  exit false
end

08-28 12:47