新手问题 求助 mysql2 不能 catch exception

young4u_amy · 2014年09月25日 · 最后由 yijunlin 回复于 2014年09月28日 · 2240 次阅读

想写一个简单的 ruby 脚本往数据库插数据,但是想捕获异常的时候遇到困难。比如我故意使用错误的数据库密码连接,但 rescue 却不能捕获到异常。求问是我哪里做的不对么?

ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0]
begin 
   client = Mysql2::Client.new(
      :host => MYSQL_HOST, :username => MYSQL_USER,
      :password => MYSQL_PASS, :database => MYSQL_DB
   )
   # some update query below 
rescue Exception => e
   puts e.message
   puts e.backtrace.inspect
end

rescue 后面指定类,那么只能捕捉到那种类型的异常

begin 
   client = Mysql2::Client.new(
      :host => MYSQL_HOST, :username => MYSQL_USER,
      :password => MYSQL_PASS, :database => MYSQL_DB
   )
rescue => e
   puts e.message
   puts e.backtrace.inspect
end

#1 楼 @huacnlee 感谢秒回,不过试了下好像还是不行。 之前用

rescue Mysql2::Error => e

也不行

你原先的写法没问题啊,你说的不能捕获到异常是指什么?

#3 楼 @quakewang 比如我故意用错误的密码连接数据库,然后执行一个update query,应该报一个数据库连接的错误啊 我在rescue里设置把错误信息发送邮件,会收到其他的程序报错,比如nilClass,但收不到 mysql 相关的报错,只是中断程序执行

按照你的写法会输出 Access denied for user 'xxx'@'localhost' (using password: YES) 说明已经捕捉到错误了

#5 楼 @quakewang 没啊 我执行完什么输出都没用,假如我用正确的密码连接,加上

results = client.query("update table1 set name='test'")

puts results.count

我就会收到邮件:

undefined method `count' for nil:NilClass

@young4u_amy 如果你用错误密码连接 DB,那么 new 的返回值是什么?MySql2 的连接错误是抛出 exception 还是,默默地把 client 设置成 nil?如果是后者的话,那确实捕捉不到 exception,因为没抛。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号