Preface
以下這個程式,預期使用者要輸入整數:
- # encoding: Big5
- print "輸入整數:"
- input = gets.to_i
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
begin...rescue...ensure
在 Ruby 中程式若發生錯誤,會丟出例外,例外為 Exception 或其子類別實例,以上例而言就是引發(Raise)ArgumentError 物件,如果程式沒有處理例外而丟出至執行環境,則會顯示例外追蹤(Trace back)並中斷程式。如果你想要處理例外,則可以使用begin...rescue 語句。例如:
- # encoding: Big5
- begin
- print "輸入整數:"
- input = Integer(gets)
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
- rescue ArgumentError
- puts "請輸入阿拉伯數字"
- end
- # encoding: Big5
- begin
- print "輸入整數:"
- input = Integer(gets)
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
- rescue ArgumentError
- puts "請輸入阿拉伯數字"
- rescue TypeError, Interrupt
- puts "使用者中斷程式"
- rescue
- puts "不明的程式中斷"
- end
- # encoding: Big5
- print "檔案名稱:"
- name = gets.chomp
- file = open(name, "r")
- begin
- file.each do |line|
- print line
- end
- rescue
- print "讀取檔案發生錯誤"
- ensure
- file.close
- end
可以在 rescue 捕捉到例外後,將例外物件指定給變數。例如:
在使用 raise 引發錯誤時,可以附上訊息,若 rescue 捕捉到例外物件時,可以使用 message 方法取得訊息:
這相當於:
也可以使用例外物件的 backtrace 取得例外追蹤訊息,訊息會以陣列型態傳回。例如:
- # encoding: Big5
- begin
- print "輸入整數:"
- input = Integer(gets)
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
- rescue ArgumentError => e
- puts "請輸入阿拉伯數字"
- print e.backtrace
- end
在定義方法時,若 begin...end 邊界實際上就是方法邊界,可只撰寫 rescue。例如下面這個 odd_even? 方法:
- # encoding: Big5
- def odd_even?
- begin
- print "輸入整數:"
- input = Integer(gets)
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
- rescue ArgumentError => e
- puts "請輸入阿拉伯數字"
- print e.backtrace
- end
- end
- odd_even?
- # encoding: Big5
- def odd_even?
- print "輸入整數:"
- input = Integer(gets)
- puts "#{input} 為 %s" % (input % 2 == 0 ? "偶數" : "奇數")
- rescue ArgumentError => e
- puts "請輸入阿拉伯數字"
- print e.backtrace
- end
- odd_even?
* Ruby 使用手冊 - 例外處理 之 救援 (rescue)
* Ruby 使用手冊 - 例外處理 之 確認 (ensure)
沒有留言:
張貼留言