亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

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

詳解Ruby中的異常

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

異常和執(zhí)行總是被聯(lián)系在一起。如果您打開一個不存在的文件,且沒有恰當?shù)靥幚磉@種情況,那么您的程序則被認為是低質(zhì)量的。

如果異常發(fā)生,則程序停止。異常用于處理各種類型的錯誤,這些錯誤可能在程序執(zhí)行期間發(fā)生,所以要采取適當?shù)男袆樱恢劣谧尦绦蛲耆V埂?/p>

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

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

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

對于 begin 塊中的每個 rescue 子句,Ruby 把拋出的異常與每個參數(shù)進行輪流比較。如果 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"

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

您可以使用 rescue 塊捕獲異常,然后使用 retry 語句從開頭開始執(zhí)行 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.     打開時發(fā)生異常。
  2.     跳到 rescue。fname 被重新賦值。
  3.     通過 retry 跳到 begin 的開頭。
  4.     這次文件成功打開。
  5.     繼續(xù)基本的過程。

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

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

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

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

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

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

第四種形式與第三種形式類似,您可以添加任何額外的條件語句(比如 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.' 

這將產(chǎn)生以下結果:

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 

這將產(chǎn)生以下結果:

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

使用 ensure 語句

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

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

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

這將產(chǎn)生以下結果:

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

使用 else 語句

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

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

begin
  #.. 過程
  #.. 拋出異常
rescue
  #.. 處理錯誤
else
  #.. 如果沒有異常則執(zhí)行
ensure
  #.. 最后確保執(zhí)行
  #.. 這總是會執(zhí)行
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

這將產(chǎn)生以下結果:

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

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

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

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

throw :lablename
#.. 這不會被執(zhí)行
catch :lablename do
#.. 在遇到一個 throw 后匹配將被執(zhí)行的 catch
end
 
OR
 
throw :lablename condition
#.. 這不會被執(zhí)行
catch :lablename do
#.. 在遇到一個 throw 后匹配將被執(zhí)行的 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:")

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

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

類 Exception

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

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

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

讓我們看一個實例:

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

現(xiàn)在,看下面的實例,將用到上面的異常:

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

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

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

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

巨人網(wǎng)絡通訊聲明:本文標題《詳解Ruby中的異常》,本文關鍵詞  詳解,Ruby,中的,異常,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Ruby中的異常》相關的同類信息!
  • 本頁收集關于詳解Ruby中的異常的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产a视频| 四虎影视库| 久久久成人影院| 国产麻豆精品免费视频| 香蕉视频久久| 午夜激情视频在线播放| 日韩中文字幕一区| 97视频免费在线观看| 97视频免费在线观看| 99久久精品国产麻豆| 一级女性大黄生活片免费| 欧美日本免费| 成人免费观看网欧美片| 久久久久久久久综合影视网| 亚洲精品影院久久久久久| 国产视频一区在线| 国产视频一区二区在线观看| 一级毛片视频播放| 国产高清在线精品一区二区| 精品在线观看一区| 久久精品免视看国产成人2021| 欧美另类videosbestsex高清| 免费的黄色小视频| 日韩专区亚洲综合久久| 欧美一区二区三区在线观看| 国产视频久久久| 一级毛片看真人在线视频| 国产原创中文字幕| 国产成人精品综合| 精品视频在线观看视频免费视频| 久久久久久久网| 亚洲精品中文字幕久久久久久| 一本伊大人香蕉高清在线观看| 天堂网中文在线| 欧美激情一区二区三区视频| 四虎影视久久久免费| 久久99爰这里有精品国产| 国产麻豆精品视频| 国产视频久久久| 日韩中文字幕一区| 欧美激情在线精品video| 国产伦精品一区二区三区无广告 | 九九精品在线| 97视频免费在线观看| 尤物视频网站在线观看| 九九久久国产精品| 四虎影视久久久免费| a级精品九九九大片免费看| 91麻豆爱豆果冻天美星空| 亚洲精品永久一区| 九九久久国产精品大片| 欧美一级视频高清片| 天天做日日爱| 久草免费在线色站| 精品国产一区二区三区久久久狼| 亚洲精品中文一区不卡| 色综合久久久久综合体桃花网| 国产原创中文字幕| 中文字幕一区二区三区精彩视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产一区二区精品久久91| 国产一区二区精品| 日本免费区| 国产一区二区精品在线观看| 国产一区免费在线观看| 久久成人性色生活片| 香蕉视频亚洲一级| 日韩免费在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 成人免费高清视频| 四虎久久影院| 黄视频网站在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产高清视频免费观看| 国产视频在线免费观看| 国产精品免费精品自在线观看| 国产视频一区二区三区四区| 欧美国产日韩久久久| 国产麻豆精品高清在线播放| 久久国产影视免费精品| 日韩中文字幕在线播放| 日本特黄特色aaa大片免费| 日本特黄特黄aaaaa大片 | 99久久精品国产国产毛片| 91麻豆国产| 国产一区二区精品尤物| 日韩在线观看免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品久久久久久中文字幕一区| 国产成人啪精品视频免费软件| 国产精品1024永久免费视频| 免费国产在线观看| 亚洲精品久久玖玖玖玖| 一级毛片视频播放| 可以在线看黄的网站| 精品国产香蕉在线播出| 美女免费精品视频在线观看| 可以在线看黄的网站| 日本免费乱人伦在线观看| 亚洲爆爽| 成人影视在线观看| 成人在激情在线视频| 青草国产在线观看| 久久久成人影院| 99久久精品国产麻豆| 精品视频免费在线| 国产麻豆精品hdvideoss| 成人高清免费| 台湾毛片| 免费毛片基地| 欧美a级片视频| 国产不卡在线看| 久久久成人影院| 九九九国产| 999久久狠狠免费精品| 成人免费观看视频| 国产麻豆精品视频| 国产一区二区精品久久| 黄色福利片| 精品国产一区二区三区免费| 国产成人精品一区二区视频| 欧美大片一区| 一级片片| 国产精品自拍亚洲| 欧美另类videosbestsex高清| 天天做日日干| 亚洲精品影院久久久久久| 日本伦理网站| 中文字幕97| 色综合久久天天综合观看| 韩国三级香港三级日本三级la | 国产原创视频在线| 青草国产在线观看| 日韩在线观看视频网站| 黄色短视屏| 成人免费观看网欧美片| 欧美日本免费| 日本在线播放一区| 国产91精品一区| 毛片的网站| 国产网站免费在线观看| 精品久久久久久中文字幕2017| 成人免费观看视频| 免费国产在线视频| 二级片在线观看| 青草国产在线观看| 九九久久99综合一区二区| 99久久精品国产免费| 国产视频一区在线| 免费国产在线观看| 色综合久久久久综合体桃花网| 国产视频一区二区在线观看| 四虎影视精品永久免费网站| 国产a视频精品免费观看| 精品国产一区二区三区精东影业| 一级女性全黄久久生活片| 欧美大片a一级毛片视频| 久久久久久久网| 国产美女在线观看| 九九热国产视频| 91麻豆精品国产自产在线观看一区| 国产原创中文字幕| 欧美激情一区二区三区视频高清 | 欧美激情一区二区三区在线| 91麻豆爱豆果冻天美星空| 精品国产一区二区三区免费 | 四虎影视久久久免费| 日本在线www| 国产成人欧美一区二区三区的| 一级毛片视频免费| 可以在线看黄的网站| 欧美大片一区| 午夜家庭影院| 午夜久久网| 91麻豆精品国产高清在线| 国产a一级| 午夜在线亚洲男人午在线| 国产91精品一区| 亚洲www美色| 国产不卡在线观看视频| 亚洲精品影院久久久久久| 四虎影视库| 欧美激情一区二区三区在线播放| 你懂的国产精品| 欧美国产日韩一区二区三区| 国产精品自拍在线| 亚洲精品影院久久久久久| 成人免费高清视频| 99热视热频这里只有精品| 美女免费精品高清毛片在线视| 国产激情一区二区三区| 国产韩国精品一区二区三区| 天堂网中文在线| 91麻豆精品国产自产在线观看一区| 国产综合成人观看在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩中文字幕在线亚洲一区| 国产网站免费观看| 免费一级生活片| 免费国产在线观看|