Ruby面試精選30題 - Day26 Ruby的錯誤處理機制 Rescue

有一句話說得好,「不怕一萬,只怕萬一」,如何檢查程式上的錯誤是一件重要的議題。好的工程師會懂得防範於未來。現在我們就來用Ruby練習一下錯誤與例外處理吧!


重點摘要:


Ruby經典面試題目 #26

  • Ruby的錯誤處理機制 Rescue.
    Explain Error Handling in Ruby.`

Ruby能以區隔的 (compartmentalized) 方式處理錯誤及例外的程式碼區塊,基本架構:

  • beginrescue這段區間是程式可能會出錯的地方。

  • rescueend是我們對於錯誤真正發生時的反應措施。

begin
  error #something happens!
rescue
  puts 'ERROR! Rescue me!' #=> ERROR! Rescue me!
end

舉例

我們從小學的時候就學過,0不能當分母(denominator)。身為工程師,我們預期會有User不小心(或是故意)輸入了0在分母,因此在rescue段落,將0用全域變數$!最新的錯誤訊息傳進來,並提醒使用者再輸入一次分母:

begin
    print "Enter numerator: "
    num = Integer(gets)
    print "Enter denominator: "
    den = Integer(gets)
    rate = num / den
    puts rate
  
rescue
    print $!
    puts
    print "Enter denominator other than 0:"
    den = Integer(gets)  
    rate = num / den
    puts rate
end  

程式運行過程如下:

Enter numerator: 5
Enter denominator: 0
divided by 0
Enter denominator other than 0: 1
5

[第25天]在看rails文件的.exists方法是怎麼被刻出來的時候,發現了rescue...end

# File activeresource/lib/active_resource/base.rb, line 869
def exists?(id, options = {})
  if id
    prefix_options, query_options = split_options(options[:params])
    path = element_path(id, prefix_options, query_options)
    response = connection.head(path, headers)
    response.code.to_i == 200
  end
  # id && !find_single(id, options).nil? id存在且不為空
rescue ActiveResource::ResourceNotFound, ActiveResource::ResourceGone
  false
end

現在總算看得懂了!

Ref: