国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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 的一個新的實例,由于特定的異常引起數據寫入失敗。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产网友自拍电影在线 | 青青艹在线视频| 在线观看午夜av| 亚洲欧美中文字幕在线观看| av在线不卡播放| 成人欧美日韩| 国产不卡精品一区二区三区| 亚洲综合在线不卡| 国产美女高潮| 91中文字幕| 九九热在线观看| 国产爆初菊在线观看免费视频网站| 永久免费网站在线| 国产女王在线**视频 | 国产xxx在线| www网站在线观看| 国产精选在线视频拍拍拍| ·天天天天操| 开心丁香婷婷深爱五月| 国产特级嫩嫩嫩bbb| 四虎成年永久免费网站| 九九热免费视频| 国产导航在线| 99视频在线观看地址| 思思99精品视频在线观看| 国产精品视频一区二区久久| 日本视频二区| 精品176二区| 国产福利小视频在线| 99热在线免费观看| 狠狠综合久久久综合| 亚洲精品手机在线| 91麻豆福利| 18av在线播放| 精品国产白色丝袜高跟鞋| 国产区视频在线播放| 国产美女高潮一区二区三区| www.av在线| 欧美性猛交xxxx免费看蜜桃| av在线二区| 色吊丝av中文字幕| h网址在线观看| 香蕉视频在线看| 夜夜操天天干| 一本大道香蕉8中文在线视频| 国产高清一级片| 精品精品导航| 亚洲视频在线观看不卡| 99色在线观看| 波多野结衣久久高清免费| 日本福利在线观看| 日本不卡1区2区3区| av免费在线播放| 在线看黄色av| 欧美精品日韩少妇| 黄色三级视频在线观看| 最新超碰在线| 精品国产丝袜高跟鞋| 日本成人网址| 尤物在线视频| 亚洲wwwwww| 日本中文字幕高清视频| 国产一级电影网| 99re在线视频播放| 黄污在线观看| 国产福利在线视频| 亚洲精品影院在线| 国产永久免费| 国产探花视频在线观看| www黄在线观看| 91av久久| 青青草中文字幕| 国产激情在线| 国产男女av| av中文在线| 国产福利免费观看| 免费看的毛片| 亚洲精品xxxxx| 国产三区在线观看| 久久一本精品| 亚洲精品一区中文字幕电影| 国产美女在线一区二区三区| 国产成+人+亚洲+欧美+综合| 久久国产热视频| 四虎一区二区三区| 99爱在线观看| 精品视频vs精品视频| 五月婷婷视频在线观看| 蜜桃av网站| 亚洲www色| av手机免费观看| 国产黄视频网站| 国产精品免费视频二三区| 激情亚洲综合网| eeuss影影院www在线播放| 国产对白叫床清晰在线播放| 中文字幕免费在线视频| 欧美黑人乱大交| 轻轻色免费在线视频| 超碰91在线| 免费的黄网站在线观看| 日本国产在线| eeuss在线观看| 天天激情综合| 日本福利在线| 国产毛片视频| 国产一区电影| 18 激情视频在线| av免费在线一区二区三区| av免费在线观| 久热免费视频| 国产农村av| 五月婷婷视频在线观看| 国产三级自拍| 在线中文字幕第一页| 亚洲欧美日韩成人网| 蜜桃av在线免费观看| 福利在线观看| 国产精品美女视频免费观看软件| 精品女厕厕露p撒尿| 四虎影院成人| 国产小视频在线高清播放| 91精品专区| 男人天堂网在线观看| 国产一级性片| 四虎成人精品在永久在线观看| 美女免费视频黄| 国产一级黄色片免费| 亚洲综合色视频在线观看| 麻豆av在线| 91午夜视频| 激情小说 在线视频| 国产porny蝌蚪视频| 免费在线观看a| 97高清视频| 国产一级免费黄色片| 日本片在线看| 91xx在线观看| 国产理论片免费观看| 午夜在线视频| 69av二区| 国产高清一区二区三区视频| wwww在线观看免费视频| 国产一卡二卡3卡4卡四卡在线| 亚洲第一页在线播放| 国产午夜精品一区理论片| 超碰免费在线播放| 一二三四区在线观看| 国产91在线视频蝌蚪| 尤物视频在线免费观看| 欧美日韩亚洲国内综合网| 精品欧美不卡一区二区在线观看| 国产性色视频| 午夜视频在线| 最新中文字幕av专区| 99视频资源网| 99视频在线观看地址| 热99在线观看| 青青草观看免费视频在线| 天天激情综合| gogo在线高清视频| а√最新版在线天堂| eeuss影院在线播放| а天堂8中文最新版在线官网| 在线三级av| 热99re久久精品这里都是免费| 日本视频在线观看一区二区三区| 在线观看免费黄色| 欧洲一区av| 狠狠狠综合7777久夜色撩人| 免费国产在线视频| 久久久久久久久亚洲精品| 日韩国产成人| 国产在线播放av| 国产亚洲精品午夜高清影院| 国产高清av在线| 99在线免费视频| 免费影视观看网站入口| 福利在线观看| 国产精品18久久久久久久久久| 伊人国产在线看一| 另类综合图区| 国产经典三级在线| 在线国产1区| 国产在线高潮| 97最新国自产拍视频在线完整在线看| 96精品视频| www.91在线播放| 国产一级影片| 四虎精品视频| 国产小视频在线高清播放| 中文字幕av高清在线观看| 黄色国产网站在线播放| 国产激情视频一区二区三区| 亚洲欧美精品日韩欧美 | 国产精品视频流白浆免费视频| 在线播放黄色网址| 中文字幕av中文字幕| 97影院理论午夜| 最新中文字幕在线视频|