<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大漠駝鈴

    置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
    Java,Php,Shell,Python,服務器運維,大數據,SEO, 網站開發、運維,云服務技術支持,IM服務供應商, FreeSwitch搭建,技術支持等. 技術討論QQ群:428622099
    隨筆 - 238, 文章 - 3, 評論 - 117, 引用 - 0
    數據加載中……

    Ruby 異常處理(轉載)

    http://jbf034.javaeye.com/blog/221347
    異常處理是開發過程中經常要面對的問題,基本所有高級語言都有自己的異常處理系統,ruby也不例外,而且使用起來也非常簡單。

    ruby中異常的拋出是使用的raise方法,記住哦,這是個方法,由ruby Kernel提供的,而不是關鍵字,同時ruby也為這個方法提供了一個別名fail,可以用fail代替raise,拋出異常的例子如下:
    Ruby代碼
    raise                                     #拋出一個默認的RuntimeError  
    raise "Some error message"                #拋出一個消息為"Some error message"的RuntimeError  
    raise ArgumentError                       #拋出一個無消息的ArgumentError  
    raise ArgumentError, "Bad data"           #拋出一個消息為"Bad data"的ArgumentError  
    raise ArgumentError.new("Bad data")       #同上  
    raise ArgumentError ArgumentError, "Bad data", caller[0]  #拋出一個包含消息的格式為filename:line 或者 filename:line:in 'method' 的異常 

    以上代碼中的raise可以使用別名fail代替,在沒有明確的給出異常類型時,ruby默認拋出RuntimeError,其中最后一個例子拋出的信息包含了當前錯誤所在的文件,行數已經所在的方法的信息,這些信息都存儲在caller這個數組中,里面包含了方法調用者的相關信息,第一個元素包 含了方法的調用者的信息,第二個信息包含了方法調用者的調用者的信息,以此類推。這個數組在我們想知道異常是在哪個地方的哪個調用被拋出的時候非常有用 的。

    Ruby代碼
      
    def func1  
    puts caller              
    #打印調用者信息  
    end 
     
    def func2  
    func1                    
    #第六行  
    end 
     
    def func3  
    func2                    
    #第十行  
    end 
     
    func3                    
    #最終調用者,十三行  
     
    #運行結果  
    #
    test.rb:6:in `func2'  
    #
    test.rb:10:in `func3'  
    #
    test.rb:13 
          



    從上面的代碼可以看出,caller記錄了每個調用者所在的文件名,行數以及方法。

    上面講解了關于ruby異常拋出的方式以及caller數組的作用,接下來我們來了解一下ruby中是如何進行異常的捕捉的,在java中,異常 的捕捉是在try ... catch當中進行,而ruby則是在begin ... end代碼塊中進行異常的捕捉,在該代碼塊中使用rescue關鍵字進行捕捉異常類型,注意哦,這個是關鍵字,而不是方法。
    Ruby代碼
    begin 
        ......                               #可能出現異常的代碼  
    rescue  errorType1            #要捕捉的異常類型  
        ......                               #處理異常的代碼  
    rescue  errorType2            #要捕捉的異常類型  
        ......                               #處理異常的代碼  
    end 


    以上代碼就是一個大概的捕捉異常的例子,在begin和end代碼塊中通過rescue進行異常類型的捕捉然后進行適當的處理,可是如果拋出的異常類型并沒有顯示的捕捉如何處理呢?那就是在最后使用else,如下:
    Ruby代碼
    begin 
        ......                               #可能出現異常的代碼  
    rescue  errorType1            #要捕捉的異常類型  
        ......                               #處理異常的代碼  
    rescue  errorType2            #要捕捉的異常類型  
        ......                               #處理異常的代碼  
    else 
        ......                               #如果以上代碼類型都沒有捕捉到,則運行該段代碼  
    end 

    begin
        ......                               #可能出現異常的代碼
    rescue  errorType1            #要捕捉的異常類型
        ......                               #處理異常的代碼
    rescue  errorType2            #要捕捉的異常類型
        ......                               #處理異常的代碼
    else
        ......                               #如果以上代碼類型都沒有捕捉到,則運行該段代碼
    end

    這時又有一個問題,如果我想獲取異常信息又該如何做呢?請看下面的代碼:
    Ruby代碼
    begin 
       raise ArgumentError, "Bad data" 
    rescue => err  
      puts err  
    end 


    通過rescue => variable的方式,就可以將異常保存為一個variable了。又解決了一個問題,還有什么問題呢?啊,對了,在java的使用當中,比如使用 Connection進行數據庫連接后,最后一定要進行資源的清理,都是在finally塊當中進行的,可是在ruby中又如何進行這些資源的清理呢?看 看下面的代碼:
    Ruby代碼
    begin 
       raise ArgumentError, "Bad data" 
    rescue => err  
      puts err  
    ensure 
      ...                       #執行清理工作  
    end 


    從上面代碼我們看到,ruby提供了一個關鍵字ensure,它的作用和java中的finally一樣,無論任何異常,該關鍵字下的代碼都必然 會在退出代碼塊前執行。同時,ruby還提供恢復功能,如果在拋出異常并進行異常處理后我們需要進行恢復工作,那就是使用retry就會重新執行代碼塊 了。

    上面提到,異常的捕捉處理必須在begin-end代碼塊中進行,那是不是無論什么時候都要書寫begin-end這兩個關鍵字呢?其實也不是,在 ruby中,方法實際上就是一個隱式的begin-end代碼塊,所以在方法中進行異常的捕捉和處理,可以省略begin。

    posted on 2010-03-25 10:11 草原上的駱駝 閱讀(952) 評論(0)  編輯  收藏 所屬分類: Ruby

    主站蜘蛛池模板: 四虎影视久久久免费观看| 羞羞视频网站免费入口| 无码av免费一区二区三区试看| 国产精品亚洲αv天堂无码| 四虎国产精品成人免费久久| 免费人妻无码不卡中文字幕18禁| 国产亚洲精品成人久久网站 | 婷婷国产偷v国产偷v亚洲| 韩国欧洲一级毛片免费| 亚洲av乱码一区二区三区按摩 | 水蜜桃视频在线观看免费| 免费人成网站在线播放| 99在线视频免费观看| 亚洲日本在线观看| 成年性午夜免费视频网站不卡| 亚洲中文字幕久久久一区| 亚洲&#228;v永久无码精品天堂久久| 狠狠入ady亚洲精品| 国产成人精品亚洲精品| 国产成人精品一区二区三区免费| 亚洲黄色中文字幕| 午夜小视频免费观看| 四虎影视久久久免费| 亚洲AV无码国产丝袜在线观看| 精品一区二区三区无码免费视频 | 免费人成视网站在线观看不卡| 久久嫩草影院免费看夜色| 亚洲黄色三级网站| 国产jizzjizz视频免费看| 国产真人无码作爱免费视频| 亚洲成人网在线播放| 全部免费国产潢色一级| 久久免费国产视频| 亚洲国产成人综合精品| 亚洲色精品88色婷婷七月丁香| 成人免费观看一区二区| 老司机亚洲精品影院在线观看| 久久久久亚洲精品无码系列| 国产精品免费电影| 久久久久久毛片免费播放| 在线观看亚洲视频|