婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解Ruby中的異常

詳解Ruby中的異常

熱門標簽:巫師3地圖標注魔力之所 柯城手機地圖如何做地圖標注 淮安自動外呼系統供應商 AI電銷機器人 線路 天津外呼系統怎么收費 外呼線路從哪里出來的 漯河電銷 征服者企業地圖標注 中牟外呼系統違法嗎

異常和執行總是被聯系在一起。如果您打開一個不存在的文件,且沒有恰當地處理這種情況,那么您的程序則被認為是低質量的。

如果異常發生,則程序停止。異常用于處理各種類型的錯誤,這些錯誤可能在程序執行期間發生,所以要采取適當的行動,而不至于讓程序完全停止。

Ruby 提供了一個完美的處理異常的機制。我們可以在 begin/end 塊中附上可能拋出異常的代碼,并使用 rescue 子句告訴 Ruby 完美要處理的異常類型。
語法

begin 
# - 
rescue OneTypeOfException 
# - 
rescue AnotherTypeOfException 
# - 
else 
# 其他異常
ensure
# 總是被執行
end

從 begin 到 rescue 中的一切是受保護的。如果代碼塊執行期間發生了異常,控制會傳到 rescue 和 end 之間的塊。

對于 begin 塊中的每個 rescue 子句,Ruby 把拋出的異常與每個參數進行輪流比較。如果 rescue 子句中命名的異常與當前拋出的異常類型相同,或者是該異常的父類,則匹配成功。

如果異常不匹配所有指定的錯誤類型,我們可以在所有的 rescue 子句后使用一個 else 子句。
實例

#!/usr/bin/ruby
 
begin
  file = open("/unexistant_file")
  if file
   puts "File opened successfully"
  end
rescue
   file = STDIN
end
print file, "==", STDIN, "\n"

這將產生以下結果。您可以看到,STDIN 取代了 file ,因為打開失敗。
#IO:0xb7d16f84>==#IO:0xb7d16f84>
使用 retry 語句

您可以使用 rescue 塊捕獲異常,然后使用 retry 語句從開頭開始執行 begin 塊。
語法

begin
  # 這段代碼拋出的異常將被下面的 rescue 子句捕獲
rescue
  # 這個塊將捕獲所有類型的異常
  retry # 這將把控制移到 begin 的開頭
end
實例
#!/usr/bin/ruby
 
begin
  file = open("/unexistant_file")
  if file
   puts "File opened successfully"
  end
rescue
  fname = "existant_file"
  retry
end

以下是處理流程:

  1.     打開時發生異常。
  2.     跳到 rescue。fname 被重新賦值。
  3.     通過 retry 跳到 begin 的開頭。
  4.     這次文件成功打開。
  5.     繼續基本的過程。

注意:如果被重新命名的文件不存在,本勢力代碼會無限嘗試。所以異常處理時,謹慎使用 retry。
使用 raise 語句

您可以使用 raise 語句拋出異常。下面的方法在調用時拋出異常。它的第二個消息將被輸出。
語法

raise
 
OR
 
raise "Error Message"
 
OR
 
raise ExceptionType, "Error Message"
 
OR
 
raise ExceptionType, "Error Message" condition

第一種形式簡單地重新拋出當前異常(如果沒有當前異常則拋出一個 RuntimeError)。這用在傳入異常之前需要解釋異常的異常處理程序中。

第二種形式創建一個新的 RuntimeError 異常,設置它的消息為給定的字符串。該異常之后拋出到調用堆棧。

第三種形式使用第一個參數創建一個異常,然后設置相關的消息為第二個參數。

第四種形式與第三種形式類似,您可以添加任何額外的條件語句(比如 unless)來拋出異常。
實例

#!/usr/bin/ruby
 
begin 
  puts 'I am before the raise.' 
  raise 'An error has occurred.' 
  puts 'I am after the raise.' 
rescue 
  puts 'I am rescued.' 
end 
puts 'I am after the begin block.' 

這將產生以下結果:

I am before the raise. 
I am rescued. 
I am after the begin block. 

另一個演示 raise 用法的實例:

#!/usr/bin/ruby
 
begin 
 raise 'A test exception.' 
rescue Exception => e 
 puts e.message 
 puts e.backtrace.inspect 
end 

這將產生以下結果:

A test exception.
["main.rb:4"]

使用 ensure 語句

有時候,無論是否拋出異常,您需要保證一些處理在代碼塊結束時完成。例如,您可能在進入時打開了一個文件,當您退出塊時,您需要確保關閉文件。

ensure 子句做的就是這個。ensure 放在最后一個 rescue 子句后,并包含一個塊終止時總是執行的代碼塊。它與塊是否正常退出、是否拋出并處理異常、是否因一個未捕獲的異常而終止,這些都沒關系,ensure 塊始終都會運行。
語法

begin
  #.. 過程
  #.. 拋出異常
rescue
  #.. 處理錯誤
ensure
  #.. 最后確保執行
  #.. 這總是會執行
end
實例
begin
 raise 'A test exception.'
rescue Exception => e
 puts e.message
 puts e.backtrace.inspect
ensure
 puts "Ensuring execution"
end

這將產生以下結果:

A test exception.
["main.rb:4"]
Ensuring execution

使用 else 語句

如果提供了 else 子句,它一般是放置在 rescue 子句之后,任意 ensure 之前。

else 子句的主體只有在代碼主體沒有拋出異常時執行。
語法

begin
  #.. 過程
  #.. 拋出異常
rescue
  #.. 處理錯誤
else
  #.. 如果沒有異常則執行
ensure
  #.. 最后確保執行
  #.. 這總是會執行
end
實例
begin
 # 拋出 'A test exception.'
 puts "I'm not raising exception"
rescue Exception => e
 puts e.message
 puts e.backtrace.inspect
else
  puts "Congratulations-- no errors!"
ensure
 puts "Ensuring execution"
end

這將產生以下結果:

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

使用 $! 變量可以捕獲拋出的錯誤消息。
Catch 和 Throw

raise 和 rescue 的異常機制能在發生錯誤時放棄執行,有時候需要在正常處理時跳出一些深層嵌套的結構。此時 catch 和 throw 就派上用場了。

catch 定義了一個使用給定的名稱(可以是 Symbol 或 String)作為標簽的塊。塊會正常執行知道遇到一個 throw。
語法

throw :lablename
#.. 這不會被執行
catch :lablename do
#.. 在遇到一個 throw 后匹配將被執行的 catch
end
 
OR
 
throw :lablename condition
#.. 這不會被執行
catch :lablename do
#.. 在遇到一個 throw 后匹配將被執行的 catch
end

實例

下面的實例中,如果用戶鍵入 '!' 回應任何提示,使用一個 throw 終止與用戶的交互。

def promptAndGet(prompt)
  print prompt
  res = readline.chomp
  throw :quitRequested if res == "!"
  return res
end
 
catch :quitRequested do
  name = promptAndGet("Name: ")
  age = promptAndGet("Age: ")
  sex = promptAndGet("Sex: ")
  # ..
  # 處理信息
end
promptAndGet("Name:")

上面的程序需要人工交互,您可以在您的計算機上進行嘗試。這將產生以下結果:

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

類 Exception

Ruby 的標準類和模塊拋出異常。所有的異常類組成一個層次,包括頂部的 Exception 類在內。下一層是七種不同的類型:

  1.     Interrupt
  2.     NoMemoryError
  3.     SignalException
  4.     ScriptError
  5.     StandardError
  6.     SystemExit
  7.     Fatal 是該層中另一種異常,但是 Ruby 解釋器只在內部使用它。

ScriptError 和 StandardError 都有一些子類,但是在這里我們不需要了解這些細節。最重要的事情是創建我們自己的異常類,它們必須是類 Exception 或其子代的子類。

讓我們看一個實例:

class FileSaveError  StandardError
  attr_reader :reason
  def initialize(reason)
   @reason = reason
  end
end

現在,看下面的實例,將用到上面的異常:

File.open(path, "w") do |file|
begin
  # 寫出數據 ...
rescue
  # 發生錯誤
  raise FileSaveError.new($!)
end
end

在這里,最重要的一行是 raise FileSaveError.new($!)。我們調用 raise 來示意異常已經發生,把它傳給 FileSaveError 的一個新的實例,由于特定的異常引起數據寫入失敗。

您可能感興趣的文章:
  • ruby 異常處理:ensure
  • ruby 異常處理:rescue
  • Ruby中的異常處理代碼編寫示例

標簽:棗莊 甘孜 南昌 克拉瑪依 內江 西雙版納 大慶 河池

巨人網絡通訊聲明:本文標題《詳解Ruby中的異常》,本文關鍵詞  詳解,Ruby,中的,異常,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Ruby中的異常》相關的同類信息!
  • 本頁收集關于詳解Ruby中的異常的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产亚洲精品精华液| 日韩成人精品视频| 国产性做久久久久久| 久久精品一区八戒影视| 亚洲国产精品成人综合| 伊人色综合久久天天人手人婷| 亚洲成人自拍一区| 蜜臀av一级做a爰片久久| 韩国午夜理伦三级不卡影院| 91在线丨porny丨国产| 日韩欧美一级特黄在线播放| 日韩一区欧美小说| 卡一卡二国产精品 | 久久www免费人成看片高清| 国产精品12区| 欧美日韩五月天| 国产精品五月天| 久草精品在线观看| 在线看日本不卡| 国产欧美一区二区精品忘忧草| 性做久久久久久久免费看| 国产一区欧美一区| 在线亚洲欧美专区二区| 亚洲国产精品成人综合| 免费亚洲电影在线| 91麻豆精品一区二区三区| 久久精品一区二区三区av| 亚洲午夜成aⅴ人片| 成人久久久精品乱码一区二区三区| 91豆麻精品91久久久久久| 欧美精品一区男女天堂| 天天色天天操综合| 国产不卡视频一区| 欧美人妖巨大在线| 国产精品国产自产拍在线| 奇米一区二区三区| 欧美在线三级电影| 亚洲精品写真福利| 成人免费视频网站在线观看| 日韩午夜电影av| 日韩成人dvd| 欧美日韩国产综合草草| 一区二区三区四区激情| 成人性生交大合| 久久久久亚洲综合| 精品亚洲国内自在自线福利| 欧美一级淫片007| 青青草精品视频| 91麻豆精品国产91久久久使用方法| 一区av在线播放| 欧美亚洲精品一区| 亚洲激情五月婷婷| 99v久久综合狠狠综合久久| 国产精品毛片无遮挡高清| 国产成人在线看| 欧美激情一区在线| av激情综合网| 亚洲人吸女人奶水| 欧美优质美女网站| 亚洲国产另类av| 欧美久久久一区| 美腿丝袜一区二区三区| 精品日韩欧美在线| 看国产成人h片视频| 2017欧美狠狠色| 国产成人综合网站| 综合色天天鬼久久鬼色| 色狠狠色噜噜噜综合网| 亚洲国产精品一区二区www| 在线免费不卡视频| 日韩不卡一二三区| 精品国产制服丝袜高跟| 国产一区免费电影| 国产精品不卡在线观看| 欧美视频精品在线| 热久久一区二区| 国产亚洲精品福利| 91小视频免费看| 日本亚洲天堂网| 国产欧美视频一区二区| 在线观看欧美黄色| 麻豆专区一区二区三区四区五区| 精品国产不卡一区二区三区| 成人高清免费在线播放| 有码一区二区三区| 欧美成人精品3d动漫h| 9i在线看片成人免费| 日本免费新一区视频| 国产亲近乱来精品视频| 欧美日韩国产片| 岛国精品在线播放| 奇米色一区二区| 亚洲精品亚洲人成人网在线播放| 欧美一级欧美三级在线观看| 成人免费视频播放| 日韩精品色哟哟| 中文字幕一区二区三中文字幕| 欧美一区二区免费| 91福利视频网站| 粉嫩嫩av羞羞动漫久久久| 日韩不卡在线观看日韩不卡视频| 亚洲婷婷在线视频| 精品久久一区二区| 欧美伊人久久久久久久久影院| 国产一区在线精品| 亚洲高清一区二区三区| 久久精品视频在线看| 欧美日韩国产123区| aaa欧美日韩| 国产精品一区二区91| 日韩av电影天堂| 亚洲尤物在线视频观看| 国产精品久久精品日日| 精品电影一区二区三区| 538在线一区二区精品国产| 91在线丨porny丨国产| 国产风韵犹存在线视精品| 亚洲一区二区视频在线观看| 中文字幕欧美激情一区| 久久久久久久电影| 日韩欧美在线123| 欧美精品久久久久久久多人混战| 91网站在线播放| zzijzzij亚洲日本少妇熟睡| 国产精品一区二区无线| 久久er99热精品一区二区| 视频一区二区中文字幕| 亚洲美女视频一区| 国产精品国产a| 中文子幕无线码一区tr| 久久久久久久久99精品| 欧美成人猛片aaaaaaa| 欧美丰满一区二区免费视频| 欧美优质美女网站| 色哟哟精品一区| 91色|porny| 欧美午夜电影网| 欧美日韩黄视频| 在线不卡的av| 91精品欧美久久久久久动漫| 欧美精品在线视频| 欧美人与性动xxxx| 欧美日韩亚洲丝袜制服| 欧美精品一二三四| 7777精品伊人久久久大香线蕉最新版| 欧美日韩高清在线| 欧美一卡二卡三卡四卡| 精品国产乱码久久久久久浪潮 | 一区二区三区国产精华| 国产精品久久久久久亚洲毛片| 国产欧美日韩综合精品一区二区| 国产亚洲一二三区| 国产精品青草久久| 亚洲欧美国产三级| 亚洲国产另类av| 蜜桃久久久久久| 国产一区二区三区| 99re成人精品视频| 欧美日韩mp4| 欧美xingq一区二区| 久久网站最新地址| 国产精品污www在线观看| 日韩一区在线看| 亚洲综合色自拍一区| 日韩av电影免费观看高清完整版 | 国产东北露脸精品视频| www.性欧美| 欧美体内she精视频| 日韩精品一区二| 国产日韩欧美高清| 亚洲卡通动漫在线| 欧美aaa在线| 成人午夜精品在线| 欧美久久一二三四区| 久久九九影视网| 亚洲激情在线播放| 国内不卡的二区三区中文字幕 | 中文字幕中文字幕一区| 亚洲小少妇裸体bbw| 激情五月激情综合网| 99久久国产免费看| 555www色欧美视频| 国产精品美女久久久久久| 日韩高清不卡一区二区| 成人app下载| 日韩欧美一二区| 曰韩精品一区二区| 国产麻豆91精品| 欧美午夜精品久久久久久超碰| 精品久久久久av影院| 一区二区三区日韩欧美| 国产一区二区在线观看视频| 欧美日精品一区视频| 国产精品日韩精品欧美在线| 日韩福利视频导航| 在线一区二区视频| 日韩一区欧美一区| 国产又粗又猛又爽又黄91精品| 欧美乱熟臀69xxxxxx| 中文字幕亚洲视频|