Ruby 中的 try...catch

Nurudeen Ibrahim 2023年1月30日 2022年5月18日
  1. 使用 Ruby 中的通用錯誤訊息進行救援
  2. 使用 Ruby 異常中的訊息進行救援
  3. 在 Ruby 中搶救特定型別的異常
Ruby 中的 try...catch

異常是在程式執行期間發生的不希望發生的事件。一個例子是當程式試圖將一個數字除以零時出現 ZeroDivisionError。搶救異常是一種優雅地處理它的方法,因此它不會使程式崩潰。

Ruby 中的異常通常由兩個子句組成,beginrescuebegin 子句相當於 Python 或任何其他類似程式語言中的 try,而 rescue 相當於 catch。下面是語法。

begin
  # do something that might cause an exception
rescue
  # handle the exception here
end

讓我們編寫一個簡單的程式,在給定商品的銷售價格和成本價格的情況下計算利潤百分比。

示例程式碼:

def profit_percentage(selling_price, cost_price)
  profit = selling_price - cost_price
  "#{(profit.fdiv(cost_price) * 100)}%"
end

puts profit_percentage(30, 20)
puts profit_percentage(30, nil)

輸出:

50.0%
nil can't be coerced into Integer (TypeError)

正如我們在上面的輸出中看到的,第二次呼叫 profit_percentage 引發了錯誤,因為我們將 nil 作為 cost_price 傳遞。現在讓我們來說明一下我們可以挽救這個異常的不同方法。

使用 Ruby 中的通用錯誤訊息進行救援

使用通用錯誤訊息進行救援並不總是有幫助,因為它不會揭示異常的根本原因。

示例程式碼:

def profit_percentage(selling_price, cost_price)
  begin
    profit = selling_price - cost_price
    "#{(profit.fdiv(cost_price) * 100)}%"
  rescue
    "An unknown error occurred."
  end
end

puts profit_percentage(30, nil)

輸出:

An unknown error occurred.

使用 Ruby 異常中的訊息進行救援

如果你對引發的異常型別不感興趣,而只對錯誤訊息感興趣,則此方法會派上用場。

示例程式碼:

def profit_percentage(selling_price, cost_price)
  begin
    profit = selling_price - cost_price
    "#{(profit.fdiv(cost_price) * 100)}%"
  rescue => e
    e
  end
end

puts profit_percentage(30, nil)

輸出:

nil can't be coerced into Integer

在 Ruby 中搶救特定型別的異常

如果你只對處理特定型別的異常感興趣,這將很有幫助。

示例程式碼:

def profit_percentage(selling_price, cost_price)
  begin
    profit = selling_price - cost_price
    "#{(profit.fdiv(cost_price) * 100)}%"
  rescue TypeError
    "An argument of invalid type was detected"
  end
end

puts profit_percentage(30, nil)

輸出:

An argument of invalid type was detected

此外,值得一提的是,還有另一個可選子句 ensure,這在你總是需要執行某些程式碼而不管是否引發異常的情況下可能會有所幫助。

示例程式碼:

def profit_percentage(selling_price, cost_price)
  begin
    profit = selling_price - cost_price
    puts "#{(profit.fdiv(cost_price) * 100)}%"
  rescue => e
    puts e
  ensure
    puts "Done calculating profit %"
  end
end

profit_percentage(30, 20)
profit_percentage(30, nil)

輸出:

50.0%
Done calculating profit %

nil can't be coerced into Integer
Done calculating profit %

如上面的輸出所示,ensure 子句中的程式碼在 profit_percentage 的兩個呼叫中都被觸發。該子句通常用於在執行某些檔案操作後需要關閉檔案時,無論是否發生異常。

相關文章 - Ruby Exception