iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
1
Modern Web

30天修煉Ruby面試精選30題系列 第 26

Day26 - Ruby的錯誤處理機制 Rescue

  • 分享至 

  • xImage
  •  

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


Ruby經典面試題目 #26

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

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

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

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

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

百百款的錯誤類型

沒有人不犯錯的,犯錯是最好的學習機會!工程師的有一部份工作就是尋找錯誤出現在哪裡,更進一步地預防所有可能會出現的錯誤!這張圖我非常喜歡,把各種錯誤類型用架構方式呈現:

https://ithelp.ithome.com.tw/upload/images/20181102/20111177bqrIbjdMf0.png

而且許多錯誤類型,我們在鐵人賽夠過這幾天來的舉例都有經歷到呢!!!

當然,遇到最多的,還是ScriptError下的Syntax Error

以及StandardError下的Type ErrorNoMethod Error啦(顯示為蒐集各類型錯誤很開心的樣子。)

Ruby: 用Rescue段落避免可能的Error範例

我們從上小學的時候就在數學課學過,0不能當分母(denominator)。身為工程師,我們預期會有User不小心(或是故意)輸入了0在分母,造成ZeroDivisionError。因此在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

輸入0的情況可以順利被我們rescue起來啦!

Rails的錯誤處理機制Rescue範例

[第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:


上一篇
Day25 - 初探 Rails: .present? 和 .exists?比較
下一篇
Day27 - 如何設定Ruby裡的Hash預設值?
系列文
30天修煉Ruby面試精選30題31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言