【发布时间】:2013-02-18 03:37:23
【问题描述】:
我正在学习 Ruby。我正在尝试使用mysql gem 连接到 MySQL 数据库。我关心的一个问题是连接关闭。
在异常抛出等意外情况下,如何确保连接关闭?
【问题讨论】:
-
这就是
begin/rescue/ensure(又名try/catch/finally)的用途。
标签: ruby exception resource-management
我正在学习 Ruby。我正在尝试使用mysql gem 连接到 MySQL 数据库。我关心的一个问题是连接关闭。
在异常抛出等意外情况下,如何确保连接关闭?
【问题讨论】:
begin/rescue/ensure(又名try/catch/finally)的用途。
标签: ruby exception resource-management
你的意思是,像这样的东西?
begin
db = open_mysql_connection
# do stuff
ensure
# this block is always executed, even if exception is raised
db.close
end
【讨论】:
raise 或kill,则连接可能会泄漏。 stdlib 的Timeout::timeout 就是使用这种本质上不安全的线程竞争来开展业务。
Thread#raise 和朋友们的内在 hinkiness:Ruby's Thread#raise, Thread#kill, timeout.rb, and net/protocol.rb libraries are broken