亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

詳解Ruby中的異常

2020-10-29 19:41:21
字體:
來源:轉載
供稿:網友

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

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

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"  endrescue   file = STDINendprint 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"  endrescue  fname = "existant_file"  retryend

以下是處理流程:

  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.inspectensure 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.inspectelse  puts "Congratulations-- no errors!"ensure puts "Ensuring execution"end

這將產生以下結果:

I'm not raising exceptionCongratulations-- no errors!Ensuring execution

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

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

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

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

實例

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

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

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

Name: Ruby on RailsAge: 3Sex: !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  endend

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
xxxxxxxxx欧美| 色樱桃影院亚洲精品影院| 国产区亚洲区欧美区| 国产欧美在线观看| 2019国产精品自在线拍国产不卡| 2019国产精品自在线拍国产不卡| 一区二区在线视频| 91美女福利视频高清| 欧洲亚洲在线视频| 国内揄拍国内精品少妇国语| 久久国产精品久久国产精品| 亚洲成人a级网| 亚洲天堂成人在线视频| 久久人人爽亚洲精品天堂| 成人av资源在线播放| 高清欧美性猛交xxxx| 国产日韩在线观看av| 日韩av免费看| 国产成人精品免费久久久久| 美女久久久久久久| 精品久久久一区二区| 一区二区日韩精品| 永久免费看mv网站入口亚洲| 国产日韩欧美在线| 日韩高清人体午夜| 精品久久久久久中文字幕大豆网| 久久综合久中文字幕青草| 日本一欧美一欧美一亚洲视频| 久久av资源网站| 日韩在线视频免费观看高清中文| 精品中文字幕久久久久久| 国产精品自产拍高潮在线观看| 91理论片午午论夜理片久久| 欧美日韩加勒比精品一区| 欧美性xxxxx极品娇小| 精品欧美aⅴ在线网站| 日韩欧美精品中文字幕| 久精品免费视频| 欧美有码在线观看视频| 亚洲人午夜色婷婷| 久久久久久91| 精品国产一区二区在线| 亚洲精品成人网| 欧美日韩福利视频| 91成人在线播放| 日av在线播放中文不卡| 久久精品国产久精国产一老狼| 2019亚洲男人天堂| 亚洲一区制服诱惑| 77777亚洲午夜久久多人| 国产综合色香蕉精品| 久久久久久久久久久91| 精品动漫一区二区| 国产精品扒开腿做爽爽爽的视频| 中文字幕精品影院| 日韩精品极品毛片系列视频| 亚洲精品中文字幕女同| 性欧美xxxx视频在线观看| 国产精品pans私拍| 亚洲精品aⅴ中文字幕乱码| www.99久久热国产日韩欧美.com| 亚洲免费av片| 国产日本欧美视频| 2019av中文字幕| 欧美成人激情图片网| 亚洲电影免费观看高清完整版在线观看| 欧美在线不卡区| 日韩免费观看av| 日韩精品中文字幕在线观看| 久久精品国产69国产精品亚洲| 性色av一区二区三区免费| 国产精品成人av性教育| 成人午夜一级二级三级| 亚洲天堂网站在线观看视频| 国产精品自产拍在线观看中文| 北条麻妃一区二区在线观看| 综合网日日天干夜夜久久| 成人福利网站在线观看| 精品高清一区二区三区| 日韩精品在线免费观看| 亚洲人成自拍网站| 欧美极品美女电影一区| 91久久嫩草影院一区二区| 国产97在线播放| 亚洲淫片在线视频| 国产精品中文字幕在线观看| 国产美女久久精品香蕉69| 91在线免费看网站| 亚洲精品久久久久中文字幕二区| 亚洲性线免费观看视频成熟| 国产精品视频资源| 欧美激情精品久久久| 欧美大胆a视频| 日韩精品小视频| 国产一区二区丝袜| 成人av电影天堂| 97视频在线观看成人| 国产成人精品免高潮费视频| 亚洲免费视频观看| 国产精品av在线| 91网在线免费观看| 久久精视频免费在线久久完整在线看| 欧美大片免费看| 91精品国产综合久久久久久蜜臀| 黄网站色欧美视频| 4k岛国日韩精品**专区| 热久久免费国产视频| 欧美视频在线观看免费| 久久综合伊人77777| 毛片精品免费在线观看| 亚洲视频在线视频| 欧美日韩一区二区在线| 欧美电影第一页| 国内精品一区二区三区四区| 亚洲激情免费观看| 欧美精品videosex牲欧美| 国产免费亚洲高清| 欧美成人四级hd版| 亚洲综合日韩中文字幕v在线| 亚洲欧美国产va在线影院| 国产成人精彩在线视频九色| 久久久精品国产网站| 久久视频精品在线| 成人在线中文字幕| 欧美日韩国产精品一区| 亚洲精品白浆高清久久久久久| 日韩av日韩在线观看| 精品视频一区在线视频| 91色在线观看| 日韩av在线不卡| 久久五月情影视| 91香蕉嫩草神马影院在线观看| 亚洲视频专区在线| 91国内免费在线视频| 17婷婷久久www| 法国裸体一区二区| 亚洲视频专区在线| 91国偷自产一区二区三区的观看方式| 日韩在线视频播放| 国产成人精品一区二区三区| 国产成人精品一区二区三区| 欧美中文字幕精品| 国产一区二区三区在线看| 国内精品美女av在线播放| 国产精品va在线播放| 欧美性69xxxx肥| 成人免费黄色网| 欧美激情第99页| 国产精品 欧美在线| 亚洲女同性videos| 中文字幕亚洲激情| 欧美黄色性视频| 国产精品99久久久久久久久| 亚洲人成在线观| 91在线精品视频| 日韩欧美一区视频| 一区二区三区美女xx视频| 国产区精品在线观看| 欧美性生交大片免网| 久久综合伊人77777蜜臀| 久久久久久网站| 欧美亚洲国产视频小说| 国产精品一区二区电影| 日韩欧美a级成人黄色|