欢迎来到cool的博客
7

Music box

Click to Start

点击头像播放音乐
新博客链接

Rails的錯誤處理機制begin、rescue和Exception

在執行程式的時候,我們不免都會遇到例外的處理方式,在Rails中我們可以輕易地透過begin-end的block和rescue來處理例外產生的情況。

begin 
  # 可能出現例外的程式碼
rescue ScriptError
  # 出現ScriptError時執行此程式碼
rescue ArgumentError
  # 出現ArgumentError時執行此程式碼
rescue SomeOtherException
  # 出現SomeOhterException時執行此程式碼
end

什麼是begin-end block?

begin來自於Object類別,基本上和end一起使用,主要是用來處理例外產生的機制,常被統稱為begin block或是begin-end block。

什麼是rescue?

rescue可以用來指派錯誤處理的子句,當沒有指定Exception類別的話,就會直接執行。

begin 
  # 可能出現例外的程式碼
rescue
  # 沒有指定Exception的類別的話,那就是出現錯誤就執行
end

也可以指定需要回應的Exception類別以及想要傳入的local variable。

begin   
  raise ArgumentError, "1234.0"
rescue ArgumentError => error
  puts error.inspect
end

什麼是exception?

簡單的來說就是程式執行時出現了某個預料外的結果(exception:例外),而在Ruby中出現exception時,基本上只會有兩種情況:

  1. 如果begin-end block中沒有提供rescue的話,終止程式執行
  2. 執行rescue 子句(clause)中的程式碼

在Rails中exception是來自於Exception類別或是Exception子類別的實體。在Exception類別中羅列了各種可能會產生例外的情況,像是SyntaxError、ArgumentError、RuntimeError等等。

取自rubylearning.com

什麼是raise?

在不實際執行一段會有exception的程式碼的情況下,我們也可以手動產生exception的實體來觸發我們想要的結果,在這邊我們透過使用raise這個method來執行。

raise是來自於Kernel這個module的method,預設會產生來自RuntimeError這個類別的exception實體。

def raise_exception
  puts "Before the raise method"
  raise "An error has occurred"
  puts "After the raise"
end
raise_exception
#=> "Before the raise method"
#=> RuntimeError: RuntimeError

如果不想使用預設的RuntimeError,我們可以使用raise指定exception的類別和報錯訊息。

def raise_exception
  puts "Before the raise method"
  raise ArgumentError, "報錯"
  puts "After the raise"
end
raise_exception
#=> "Before the raise method"
#=> ArgumentError: 報錯

參考資料:raise

原文链接

返回列表