大漠駝鈴

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

          Ruby 異常處理(轉(zhuǎn)載)

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

          ruby中異常的拋出是使用的raise方法,記住哦,這是個方法,由ruby Kernel提供的,而不是關(guān)鍵字,同時ruby也為這個方法提供了一個別名fail,可以用fail代替raise,拋出異常的例子如下:
          Ruby代碼
          raise                                     #拋出一個默認(rèn)的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默認(rèn)拋出RuntimeError,其中最后一個例子拋出的信息包含了當(dāng)前錯誤所在的文件,行數(shù)已經(jīng)所在的方法的信息,這些信息都存儲在caller這個數(shù)組中,里面包含了方法調(diào)用者的相關(guān)信息,第一個元素包 含了方法的調(diào)用者的信息,第二個信息包含了方法調(diào)用者的調(diào)用者的信息,以此類推。這個數(shù)組在我們想知道異常是在哪個地方的哪個調(diào)用被拋出的時候非常有用 的。

          Ruby代碼
            
          def func1  
          puts caller              
          #打印調(diào)用者信息  
          end 
           
          def func2  
          func1                    
          #第六行  
          end 
           
          def func3  
          func2                    
          #第十行  
          end 
           
          func3                    
          #最終調(diào)用者,十三行  
           
          #運(yùn)行結(jié)果  
          #
          test.rb:6:in `func2'  
          #
          test.rb:10:in `func3'  
          #
          test.rb:13 
                



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

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


          以上代碼就是一個大概的捕捉異常的例子,在begin和end代碼塊中通過rescue進(jìn)行異常類型的捕捉然后進(jìn)行適當(dāng)?shù)奶幚恚墒侨绻麙伋龅漠惓n愋筒]有顯示的捕捉如何處理呢?那就是在最后使用else,如下:
          Ruby代碼
          begin 
              ......                               #可能出現(xiàn)異常的代碼  
          rescue  errorType1            #要捕捉的異常類型  
              ......                               #處理異常的代碼  
          rescue  errorType2            #要捕捉的異常類型  
              ......                               #處理異常的代碼  
          else 
              ......                               #如果以上代碼類型都沒有捕捉到,則運(yùn)行該段代碼  
          end 

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

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


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


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

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

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

          主站蜘蛛池模板: 沽源县| 巴里| 临安市| 西林县| 温泉县| 泾源县| 凤凰县| 舟山市| 巫山县| 宣武区| 饶阳县| 怀远县| 沂水县| 新兴县| 墨玉县| 河津市| 五河县| 黑龙江省| 兴山县| 平顶山市| 集安市| 乌兰察布市| 汉寿县| 邵阳县| 屏南县| 苏尼特左旗| 长岭县| 潼南县| 衢州市| 裕民县| 苏州市| 哈巴河县| 准格尔旗| 乡城县| 汤原县| 重庆市| 朝阳县| 扶绥县| 太原市| 合肥市| 尤溪县|