Ruby 中的 try...catch

Nurudeen Ibrahim 2023年1月30日
  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