<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Ruby 異常 異常和執行總是被聯系在一起。如果您打開一個不存在的文件,且沒有恰當地處理這種情況,那么您的程序則被認為是低質量的。 如果異常發生,則程序停止。異常用于處理各種類型的錯誤,這些錯誤可能在程序執行期間發生,所以要采取適當的行動,而不至于讓程序完全停止。 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" end rescue file = STDIN end print 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" end rescue fname = "existant_file" retry end ``` 以下是處理流程: * 打開時發生異常。 * 跳到 rescue。fname 被重新賦值。 * 通過 retry 跳到 begin 的開頭。 * 這次文件成功打開。 * 繼續基本的過程。 **注意:**如果被重新命名的文件不存在,本勢力代碼會無限嘗試。所以異常處理時,謹慎使用 _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.inspect ensure 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.inspect else puts "Congratulations-- no errors!" ensure puts "Ensuring execution" end ``` 這將產生以下結果: ``` I'm not raising exception Congratulations-- no errors! Ensuring execution ``` 使用 $! 變量可以捕獲拋出的錯誤消息。 ## Catch 和 Throw raise 和 rescue 的異常機制能在發生錯誤時放棄執行,有時候需要在正常處理時跳出一些深層嵌套的結構。此時 catch 和 throw 就派上用場了。 _catch_ 定義了一個使用給定的名稱(可以是 Symbol 或 String)作為標簽的塊。塊會正常執行知道遇到一個 throw。 ## 語法 ``` throw :lablename #.. 這不會被執行 catch :lablename do #.. 在遇到一個 throw 后匹配將被執行的 catch end OR throw :lablename condition #.. 這不會被執行 catch :lablename do #.. 在遇到一個 throw 后匹配將被執行的 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:") ``` 上面的程序需要人工交互,您可以在您的計算機上進行嘗試。這將產生以下結果: ``` Name: Ruby on Rails Age: 3 Sex: ! Name:Just Ruby ``` ## 類 Exception Ruby 的標準類和模塊拋出異常。所有的異常類組成一個層次,包括頂部的 Exception 類在內。下一層是七種不同的類型: * Interrupt * NoMemoryError * SignalException * ScriptError * StandardError * SystemExit Fatal 是該層中另一種異常,但是 Ruby 解釋器只在內部使用它。 ScriptError 和 StandardError 都有一些子類,但是在這里我們不需要了解這些細節。最重要的事情是創建我們自己的異常類,它們必須是類 Exception 或其子代的子類。 讓我們看一個實例: ``` class FileSaveError < StandardError attr_reader :reason def initialize(reason) @reason = reason end end ``` 現在,看下面的實例,將用到上面的異常: ``` File.open(path, "w") do |file| begin # 寫出數據 ... rescue # 發生錯誤 raise FileSaveError.new($!) end end ``` 在這里,最重要的一行是 raise _FileSaveError.new($!)_。我們調用 raise 來示意異常已經發生,把它傳給 FileSaveError 的一個新的實例,由于特定的異常引起數據寫入失敗。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看