Ruby 異常捕獲

2021-09-04 02:44:01 字數 2280 閱讀 6569

1. 異常類

含有異常資訊的資料報是exception類、或其子類的乙個物件。當需要引發異常時,可以使用某個內建的exception類,或者建立自己的異常類。每個exception都關聯有乙個訊息字串和棧回溯資訊。如果定義自己的異常,可以新增額外的資訊。

當對作業系統的呼叫返回錯誤碼時,會引發系統錯誤。ruby得到這些錯誤,把每個錯誤包裝到特定物件中,它們都是systemcallerror的子類,定義在errno模組中,比如errno::eio。如果想得到底層的系統錯誤碼,則每個errno異常物件有乙個errno的類常量,它包含相應的系統錯誤碼,比如errno::eio::errno。

2. 處理異常

在乙個begin/end塊中,使用乙個或多個rescue語句告訴ruby希望處理的異常型別,例如:

begin

#statement

rescue myerror

puts $!

raise

end

當異常被引發時,ruby將相關exception物件的引用放在全域性變數"$!"中。可以不帶任何引數來呼叫raise,它會重新引發"$!"中的異常,它允許我們先編寫**過濾掉一些異常,再把不能處理的異常傳遞到更高的層次。

在begin塊中可以有多個rescue子句,每個rescue子句可以指示捕獲多個異常,在rescue子句的結束處,可以提供乙個ruby的區域性變數名來接收匹配的異常,例如:

begin

#statement

rescue syntaxerror => boom

puts boom

rescue standarderror => bang

puts bang

end

ruby用引發的異常依次比較begin塊中每個rescue子句的每個引數,如果引發的異常匹配了乙個引數,ruby就執行rescue的程式體,同時停止比較。如果編寫乙個不帶參數列的rescue子句,它的預設引數是standarderror,如果沒有任何rescue子句與之匹配,或者異常在begin/end塊外面被引發,ruby就沿著呼叫棧向上查詢,在呼叫者上尋找異常的處理者,接著在呼叫者的呼叫者上尋找。

rescue子句的引數通常是exception類的名稱,實際上它們可以是任何返回exception類的表示式(包括方法呼叫)。

有時需要保證一些處理在block結束時能夠被執行,通過ensure子句可以完成。ensure跟在最後的rescue子句後面,它包含一段當block退出時總是要被執行的**,不管block是否正常退出,例如:

begin

#statement

rescue syntaxerror => boom

puts boom

rescue standarderror => bang

puts bang

ensure

puts 'end'

end

有時可能可以糾正異常的原因,可以在rescue子句中使用retry語句去重複執行整個begin/end區塊,這很可能會導致無限迴圈。

3. 引發異常

可以使用raise方法在**中引發異常,例如:

raise

raise "wrong parameters"

raise myexception, "user define exception", caller

第一種形式只是簡單地重新引發當前異常,如果沒有當前異常,則引發runtimeerror。這種形式用於首先截獲異常再將其繼續傳遞的異常處理方法中。

第二種形式建立新的runtimeerror異常,把它的訊息設定為指定的字串,然後異常隨著呼叫棧向上引發。

第三種形式使用第乙個引數建立異常,然後把相關聯的訊息設定給第二個引數,同時把棧資訊設定給第三個引數。

4. 捕獲和丟擲

catch和throw能夠在正常處理過程期間從一些深度巢狀的結構中跳轉出來,例如:

catch (:done) do

while line = gets

throw :done unless fields = line.split(/\t/)

endend

catch定義了以給定名稱為標籤的block,這個block會正常執行直到遇到throw為止。當ruby碰到throw,它回溯呼叫棧,用匹配的符號尋找catch**塊,當發現它之後,ruby將棧清退到這個位置並終止該block。

mysql異常捕獲 MySql中捕獲異常的方法

下面是程式設計之家 jb51.cc 通過網路收集整理的 片段。mysql中是否能有sqlserver的 error變數呢,或者如c 中的try catch語法呢。答案是肯定的,例項 如下 code drop procedure if exists sp call jobs create proced...

關於異常捕獲

你可以查一下你的sdk,裡面有很多的exception的定義,其基類其實都是system.exception一樣。但system.exception只提供了一些一般異常的處理。更多的需要專業的來處理。比如找不到檔案,你必須捕捉system.io.filenotfoundexception這個異常。在...

python異常捕獲

python的異常處理如c c 的結構一樣。python用try.except.c c 則用try.catch.並不難理解。在對具體錯誤的獲取則有點不同,主要是語法的差異上。c 在catch後可生成相應乙個異常的類,然後可通過類物件獲取相關的錯誤資訊。而python則不同,它在獲取錯誤資訊有點奇怪,...